第一次提交

1、hpi的可用代码;
2、修复了多次点击曝光后,福亮度数据错误的问题;
3、定标方式为大的蓝菲积分球的标准能量曲线,而不是基于asd的能量曲线;
This commit is contained in:
tangchao0503
2022-09-06 22:54:14 +08:00
commit 98cf134cca
106 changed files with 39400 additions and 0 deletions

View File

@ -0,0 +1,569 @@
'''
在V1.3的版本上改进:
1使用界面PyQt5控制光谱仪的操作和显示
2界面分为两个部分一个是影像采集控制和显示一个是光谱采集控制和显示
'''
from ximea import xiapi
import numpy as np
import PIL
from osgeo import gdal #读写影像数据
import os, sys, functools, re, shutil
import datetime # 几种Python执行时间的计算方法https://blog.csdn.net/wangshuang1631/article/details/54286551
from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox, qApp, QDialog, QFileDialog
from PyQt5.QtCore import pyqtSignal, QObject, QRunnable, QThreadPool
from enter_window import *
from image_Window import *
from spectral_Window import *
import cv2
import matplotlib
matplotlib.use("Qt5Agg") # 声明使用QT5
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import matplotlib.pyplot as plt
# 主窗口
class enter_window(QMainWindow, Ui_enter_Window):
def __init__(self, parent=None):
super(enter_window, self).__init__(parent)
self.setupUi(self)
# 在刚打开软件在本窗口显示相机状态(是否打开)
self.c = Communicate()
self.c.openinfo.connect(self.printCamInfo)
# self.end_Btn.clicked.connect(self.end_event) # 绑定登陆函数
# self.exit_Btn.clicked.connect(sys.exit)
def printCamInfo(self):
self.camstatus_tb.append('相机已打开!')
# 主窗口信号类
class Communicate(QObject):
openinfo = pyqtSignal()
# 图像窗口
class image_window(QDialog, Ui_image_Window):
def __init__(self, parent=None):
super(image_window, self).__init__(parent)
self.setupUi(self)
#初始化值
self.framenumber_le.setText('100')
self.framerate_le.setText('15')
self.exposureTime_le.setText('18000')
self.filename_le.setText('test')
self.filepath_le.setText(os.getcwd())
#触发事件
self.filepath_bt.clicked.connect(self.directory_select)
self.framenumber_le.textEdited.connect(self.onchange)
self.framerate_le.textEdited.connect(self.onchange)
self.exposureTime_le.textEdited.connect(self.onchange)
self.filename_le.textEdited.connect(self.onchange)
self.filepath_le.textEdited.connect(self.onchange)
self.dc_bt.clicked.connect(self.printDcInfo)
self.wb_bt.clicked.connect(self.printWbInfo)
self.save_bt.clicked.connect(self.printSaveInfo)
self.record_bt.clicked.connect(self.printRecordInfo)
# 显示影像和调焦
self.myImageFigure = MyImageFigure()
self.image_glo.addWidget(self.myImageFigure)
self.myFocusFigure = MyImageFigure()
self.focus_glo.addWidget(self.myFocusFigure)
def printDcInfo(self):
self.statu_tb.append('采集暗电流!')
def printWbInfo(self):
self.statu_tb.append('采集白板!')
def printRecordInfo(self):
self.statu_tb.append('采集影像!')
def printSaveInfo(self):
self.statu_tb.append('保存影像!')
def onchange(self):
camera_operation.framenumber_input = self.framenumber_le.text()
camera_operation.framerate_input = self.framerate_le.text()
camera_operation.exposureTime_input = self.exposureTime_le.text()
camera_operation.fn = self.filename_le.text()
camera_operation.fp = self.filepath_le.text()
def directory_select(self):
dirpath = QFileDialog.getExistingDirectory(self, '选择存储路径文件夹', '/home')
self.filepath_le.setText(dirpath)
camera_operation.fp = dirpath
# 图像窗口画图类
class MyImageFigure(FigureCanvas):
def __init__(self, width=5, height=4, dpi=100, ):
#第一步创建一个创建Figure
self.fig = plt.figure(figsize=(width, height), dpi=dpi)
#第二步在父类中激活Figure窗口
# this is the Canvas Widget that displays the `figure`
# it takes the `figure` instance as a parameter to __init__
super(MyImageFigure, self).__init__(self.fig) # 此句必不可少,否则不能显示图形
#第三步创建一个子图用于绘制图形用111表示子图编号如matlab的subplot(1,1,1)
self.axes = self.fig.add_subplot(1, 1, 1)
self.axes.set_title('tangchao')
#第四步:就是画图,【可以在此类中画,也可以在其它类中画】
def plot(self, img):
plt.imshow(img)
# 光谱窗口
class spectral_window(QDialog, Ui_spectral_Window):
def __init__(self, parent=None):
super(spectral_window, self).__init__(parent)
self.setupUi(self)
# 初始化值
self.filename_le.setText('test')
self.filepath_le.setText(os.getcwd())
# 触发事件
self.filepath_bt.clicked.connect(self.directory_select)
self.filename_le.textEdited.connect(self.onchange)
self.filepath_le.textEdited.connect(self.onchange)
self.dc_bt.clicked.connect(self.printDcInfo)
self.wb_bt.clicked.connect(self.printWbInfo)
self.record_bt.clicked.connect(self.printRecordInfo)
# 显示光谱
self.spectralFigure = MySpectralFigure()
self.spe_glo.addWidget(self.spectralFigure)
def printDcInfo(self):
self.statu_tb.append('采集暗电流!')
def printWbInfo(self):
self.statu_tb.append('采集白板!')
def printRecordInfo(self):
self.statu_tb.append('采集光谱!')
def onchange(self):
spectral_camera_operation.fn = self.filename_le.text()
spectral_camera_operation.fp = self.filepath_le.text()
def directory_select(self):
dirpath = QFileDialog.getExistingDirectory(self, '选择存储路径文件夹', '/home')
self.filepath_le.setText(dirpath)
spectral_camera_operation.fp = dirpath
# 光谱窗口画图类
class MySpectralFigure(FigureCanvas):
def __init__(self, width=5, height=4, dpi=100):
#第一步创建一个创建Figure
self.fig = Figure(figsize=(width, height), dpi=dpi)
#第二步在父类中激活Figure窗口
# this is the Canvas Widget that displays the `figure`
# it takes the `figure` instance as a parameter to __init__
super(MySpectralFigure, self).__init__(self.fig) # 此句必不可少,否则不能显示图形
#第三步创建一个子图用于绘制图形用111表示子图编号如matlab的subplot(1,1,1)
self.axes = self.fig.add_subplot(1, 1, 1)
#第四步:就是画图,【可以在此类中画,也可以在其它类中画】
def plot(self, y):
self.axes.plot(y)
# 读写影像类
class GRID(object):
#读图像文件
def read_img(self, filename):
try:
dataset = gdal.Open(filename) # 打开文件
im_width = dataset.RasterXSize # 栅格矩阵的列数
im_height = dataset.RasterYSize # 栅格矩阵的行数
num_bands = dataset.RasterCount # 栅格矩阵的波段数
im_geotrans = dataset.GetGeoTransform() # 仿射矩阵
im_proj = dataset.GetProjection() # 地图投影信息
im_data = dataset.ReadAsArray(0, 0, im_width, im_height) # 将数据写成数组,对应栅格矩阵
del dataset
return im_proj, im_geotrans, im_data
except:
sys.exit()
#写文件以写成tif为例
def write_img(self, dst_filename, data):
format = "ENVI"
driver = gdal.GetDriverByName(format)
RasterXSize = data.shape[2] # 遥感影像的sample列数
RasterYSize = data.shape[1] # 遥感影像的line行数
band = data.shape[0]
# driver.Create()函数中RasterXSize代表影像的sample列数RasterYSize代表影像的line行数
dst_ds = driver.Create(dst_filename, RasterXSize, RasterYSize, band, gdal.GDT_Float32)
for i in range(band):
dst_ds.GetRasterBand(i + 1).WriteArray(data[i, :, :]) # gdal的band从1开始所以dst_ds.GetRasterBand(i+1)
dst_ds = None
# 影像模式类:相关的函数和变量
class camera_operation(object):
"""
在此版本的软件中关于按钮点击控制光谱仪采集操作的绑定函数都放在了if __name__ == '__main__':中
"""
#设置曝光时间和帧率
framerate_input = 15 #随便给个初始值(初始值要和framerate_le控件初始值一致)从image_window获取的手动输入的帧率
exposureTime_input = 18000
@classmethod
def set_exposureTime(cls, cam):
# settings,cam.set_param("exposure",10000)
cam.set_framerate(int(camera_operation.framerate_input))
cam.set_exposure(int(camera_operation.exposureTime_input)) # 曝光时间单位为微秒1s共有1000000微秒
# print('Exposure was set to %i us' % cam.get_exposure())
# print('Framerate was set to %i FPS' % cam.get_framerate())
image_window_instance.statu_tb.append('Exposure was set to ' + str(cam.get_exposure()) + ' us')
image_window_instance.statu_tb.append('Framerate was set to ' + str(cam.get_framerate()) + ' FPS')
#开始采集数据
framenumber_input = 100 #随便给个初始值(初始值要和framenumber_le控件初始值一致)从image_window获取的手动输入的帧数
image_dc = 1 # 随便给个初始值,此变量用于存储采集到的暗电流影像
image_wb = 1 # 随便给个初始值,此变量用于存储采集到的白板影像
focus = True # 用于调焦
@classmethod
def start_AcquireData(cls, cam):
# 创建img = xiapi.Image()前需要设置一系列img参数例如格式、位深度、
cam.set_imgdataformat('XI_RAW16')
# create instance of Image to store image data and metadata
img = xiapi.Image()
# cam.get_buffer_policy()
print('Starting data acquisition...')
starttime = datetime.datetime.now()
# 如果点击“调焦”按钮
if image_window_instance.sender().objectName() == 'focus_bt':
# camera_operation.set_exposureTime(cam)
cam.start_acquisition()
while camera_operation.focus:
cam.get_image(img) # get data and pass them from camera to img
image_raw_numpy = img.get_image_data_numpy()
image_container = image_raw_numpy[339:639, 285:1650]
image_window_instance.myFocusFigure.plot(image_container)
image_window_instance.myFocusFigure.draw()
# 如果点击“白板”按钮采集并保存白板影像到image_wb
if image_window_instance.sender().objectName() == 'wb_bt':
framenumber = 10
cam.start_acquisition()
image_container = np.empty((300, framenumber, 1365))
for i in range(framenumber):
cam.get_image(img) # get data and pass them from camera to img
image_raw_numpy = img.get_image_data_numpy()
image_container[:, i, :] = image_raw_numpy[339:639, 285:1650]
camera_operation.image_wb = image_container.mean(axis=1)
# 如果点击“暗电流”按钮采集并保存暗电流影像到image_dc
if image_window_instance.sender().objectName() == 'dc_bt':
framenumber = 10
cam.start_acquisition()
image_container = np.empty((300, framenumber, 1365))
for i in range(framenumber):
cam.get_image(img) # get data and pass them from camera to img
image_raw_numpy = img.get_image_data_numpy()
image_container[:, i, :] = image_raw_numpy[339:639, 285:1650]
camera_operation.image_dc = image_container.mean(axis=1)
#如果点击“采集”按钮,自动去除暗电流,并且转化成反射率
if image_window_instance.sender().objectName() == 'record_bt':
framenumber = int(camera_operation.framenumber_input)
cam.start_acquisition()
rgb = np.empty((3, framenumber, 1365))
with open('corning410_test', 'wb') as f:
for i in range(framenumber):
cam.get_image(img) # get data and pass them from camera to img
image_raw_numpy = img.get_image_data_numpy()
image_container = image_raw_numpy[339:639, 285:1650]
# 去除暗电流和转反射率
if type(camera_operation.image_dc) is np.ndarray or type(camera_operation.image_wb) is np.ndarray:
image_container = (image_container - camera_operation.image_dc).astype(
np.float) / camera_operation.image_wb.astype(np.float)
rgb[:, i, :] = image_container[[36, 76, 121]]
f.write(image_container.flatten().tobytes())
# 如果再这里每采集一帧就画出来,会非常影响采集速率,造成采集很慢
# image_window_instance.myImageFigure.plot(image_container[1, :, :])
# image_window_instance.myImageFigure.draw()
# 画出影像
# image_window_instance.myImageFigure.plot(
# np.dstack((image_container[121, :, :].astype(np.int), image_container[76, :, :].astype(np.int),
# image_container[36, :, :].astype(np.int))))
try:
image_window_instance.myImageFigure.plot(
np.dstack((rgb[2, :, :], rgb[1, :, :], rgb[0, :, :])))
image_window_instance.myImageFigure.draw()
finally:
print('画图出错')
endtime = datetime.datetime.now()
print('影像采集用时:%d' % (endtime - starttime).seconds)
# stop data acquisition
print('Stopping acquisition...')
cam.stop_acquisition()
#停止采集数据、计算波长、数据写入硬盘
@classmethod
def stop_AcquireDta(cls, cam, image_container, exposure = 400000, framerate = 90):
# stop data acquisition
print('Stopping acquisition...')
cam.stop_acquisition()
#保存数据
fp = os.getcwd() #随便给个初始值(初始值要和filepath_le控件初始值一致)从image_window获取的手动输入的文件保存路径
fn = 'test' #随便给个初始值(初始值要和filename_le控件初始值一致)从image_window获取的手动输入的帧率
@classmethod
def savedata(cls):
# 保存路径
filename = re.sub('/', '\\\\', camera_operation.fp) + '\\' + camera_operation.fn
#保存影像
imagefile = os.getcwd() + '\\' + 'corning410_test'
shutil.copyfile(imagefile, filename)
# 创建头文件,写入波长
with open(filename + '.hdr', mode='w') as out_hdr: # python读取已存在txt文件时读写模式为'r+',不是'r+w'w模式时如果文件不存在会创建文件
out_hdr.write('ENVI\n')
out_hdr.write('samples = 1365\n')
out_hdr.write('lines = ' + str(camera_operation.framenumber_input) + '\n')
out_hdr.write('bands = 300\n')
out_hdr.write('header offset = 0\n'
'file type = ENVI Standard\n')
out_hdr.write('data type = 4\ninterleave = bil\nbyte order = 0\n')
out_hdr.write('exposure = ' + str(camera_operation.exposureTime_input) + '\n')
out_hdr.write('framerate = ' + str(camera_operation.framerate_input) + '\n')
out_hdr.write('wavelength= {399.95876000000004, 401.958324, 403.95788799999997, 405.95745200000005, 407.957016, 409.95658, 411.95614399999994, 413.955708, 415.955272, 417.95483599999994, 419.9544, 421.953964, 423.95352799999995, 425.953092, 427.952656, 429.95221999999995, 431.95178400000003, 433.951348, 435.95091199999996, 437.95047600000004, 439.95004, 441.94960399999997, 443.94916800000004, 445.948732, 447.94829599999997, 449.94785999999993, 451.947424, 453.946988, 455.94655199999994, 457.946116, 459.94568, 461.94524399999995, 463.944808, 465.944372, 467.94393599999995, 469.94350000000003, 471.943064, 473.94262799999996, 475.94219200000003, 477.941756, 479.94131999999996, 481.94088400000004, 483.940448, 485.94001199999997, 487.93957600000005, 489.93914, 491.938704, 493.93826799999994, 495.937832, 497.937396, 499.93695999999994, 501.936524, 503.936088, 505.93565199999995, 507.935216, 509.93478, 511.93434399999995, 513.933908, 515.9334719999999, 517.9330359999999, 519.9326000000001, 521.9321640000001, 523.931728, 525.931292, 527.930856, 529.9304199999999, 531.9299839999999, 533.9295480000001, 535.929112, 537.928676, 539.92824, 541.9278039999999, 543.9273679999999, 545.9269320000001, 547.926496, 549.92606, 551.925624, 553.9251879999999, 555.9247519999999, 557.9243160000001, 559.92388, 561.923444, 563.923008, 565.922572, 567.9221359999999, 569.9216999999999, 571.9212640000001, 573.920828, 575.920392, 577.919956, 579.9195199999999, 581.9190839999999, 583.9186480000001, 585.918212, 587.917776, 589.91734, 591.9169039999999, 593.9164679999999, 595.9160320000001, 597.915596, 599.91516, 601.914724, 603.9142879999999, 605.9138519999999, 607.9134159999999, 609.9129800000001, 611.912544, 613.912108, 615.911672, 617.9112359999999, 619.9107999999999, 621.9103640000001, 623.909928, 625.909492, 627.909056, 629.9086199999999, 631.9081839999999, 633.9077480000001, 635.907312, 637.906876, 639.90644, 641.9060039999999, 643.9055679999999, 645.9051319999999, 647.9046960000001, 649.90426, 651.903824, 653.903388, 655.9029519999999, 657.9025159999999, 659.9020800000001, 661.901644, 663.901208, 665.900772, 667.9003359999999, 669.8998999999999, 671.8994640000001, 673.899028, 675.898592, 677.898156, 679.8977199999999, 681.8972839999999, 683.8968480000001, 685.896412, 687.895976, 689.89554, 691.895104, 693.8946679999999, 695.8942319999999, 697.8937960000001, 699.89336, 701.892924, 703.892488, 705.8920519999999, 707.8916159999999, 709.8911800000001, 711.890744, 713.890308, 715.889872, 717.8894359999999, 719.8889999999999, 721.8885640000001, 723.888128, 725.887692, 727.887256, 729.88682, 731.8863839999999, 733.8859479999999, 735.8855120000001, 737.885076, 739.88464, 741.884204, 743.8837679999999, 745.8833319999999, 747.8828959999998, 749.8824599999998, 751.882024, 753.881588, 755.8811519999999, 757.8807159999999, 759.8802799999999, 761.8798439999998, 763.879408, 765.878972, 767.8785359999999, 769.8780999999999, 771.8776639999999, 773.8772279999998, 775.876792, 777.876356, 779.87592, 781.8754839999999, 783.8750479999999, 785.8746119999998, 787.8741759999998, 789.87374, 791.873304, 793.8728679999999, 795.8724319999999, 797.8719959999999, 799.8715599999998, 801.871124, 803.870688, 805.8702519999999, 807.8698159999999, 809.8693799999999, 811.8689439999998, 813.868508, 815.868072, 817.867636, 819.8671999999999, 821.8667639999999, 823.8663279999998, 825.8658919999998, 827.865456, 829.86502, 831.8645839999999, 833.8641479999999, 835.8637119999999, 837.8632759999998, 839.86284, 841.862404, 843.8619679999999, 845.8615319999999, 847.8610959999999, 849.8606599999998, 851.860224, 853.859788, 855.859352, 857.8589159999999, 859.8584799999999, 861.8580439999998, 863.8576079999998, 865.857172, 867.856736, 869.8562999999999, 871.8558639999999, 873.8554279999998, 875.8549919999998, 877.854556, 879.85412, 881.8536839999999, 883.8532479999999, 885.8528119999999, 887.8523759999998, 889.85194, 891.851504, 893.8510679999999, 895.8506319999999, 897.8501959999999, 899.8497599999998, 901.8493239999998, 903.848888, 905.848452, 907.8480159999999, 909.8475799999999, 911.8471439999998, 913.8467079999998, 915.846272, 917.845836, 919.8453999999999, 921.8449639999999, 923.8445279999999, 925.8440919999998, 927.843656, 929.84322, 931.8427839999999, 933.8423479999999, 935.8419119999999, 937.8414759999998, 939.84104, 941.840604, 943.840168, 945.8397319999999, 947.8392959999999, 949.8388599999998, 951.8384239999998, 953.837988, 955.837552, 957.8371159999999, 959.8366799999999, 961.8362439999999, 963.8358079999998, 965.835372, 967.834936, 969.8344999999999, 971.8340639999999, 973.8336279999999, 975.8331919999998, 977.832756, 979.83232, 981.831884, 983.8314479999999, 985.8310119999999, 987.8305759999998, 989.8301399999998, 991.829704, 993.829268, 995.8288319999999, 997.8283959999999}')
@classmethod
def close_camera(cls, cam):
# stop communication
cam.close_device()
# 光谱模式类:相关的函数和变量
class spectral_camera_operation(object):
"""
在此版本的软件中关于按钮点击控制光谱仪采集操作的绑定函数都放在了if __name__ == '__main__':中
"""
#设置曝光时间和帧率
@classmethod
def set_exposureTime(cls, cam, exposure = 40000000):
# settings,cam.set_param("exposure",10000)
cam.set_exposure(exposure) # 曝光时间单位为微秒1s共有1000000微秒
cam.set_framerate(9)
# print('Exposure was set to %i us' % cam.get_exposure())
# print('Framerate was set to %i FPS' % cam.get_framerate())
spectral_window_instance.statu_tb.append('Exposure was set to ' + str(cam.get_exposure()) + ' us')
spectral_window_instance.statu_tb.append('Framerate was set to ' + str(cam.get_framerate()) + ' FPS')
#开始采集数据
fp = os.getcwd() # 随便给个初始值(初始值要和filepath_le控件初始值一致)从spectral_window获取的手动输入的帧率
fn = 'test' # 随便给个初始值(初始值要和filename_le控件初始值一致)从spectral_window获取的手动输入的帧率
image_dc = 1 # 随便给个初始值,此变量用于存储采集到的暗电流影像
spectral_wb = 1 # 随便给个初始值,此变量用于存储采集到的白板光谱
spectral = np.empty((300, 10)).astype(np.float) # 此ndarray用于存储采集到的目标物光谱每一列为一个光谱
@classmethod
def start_AcquireData(cls, cam):
# 创建img = xiapi.Image()前需要设置一系列img参数例如格式、位深度、
cam.set_imgdataformat('XI_RAW16')
# create instance of Image to store image data and metadata
img = xiapi.Image()
framenumber = 10 #每条光谱采集帧数
spectralNumber = 10 #每次采集的光谱数
spectralNumber_wb = 1 #每次采集的白板的光谱数
spectral_container = np.empty((300, framenumber, 3))
print('Starting data acquisition...')
starttime = datetime.datetime.now()
# 如果点击暗“暗电流”按钮
if spectral_window_instance.sender().objectName() == 'dc_bt':
cam.start_acquisition()
for i in range(framenumber):
cam.get_image(img) # get data and pass them from camera to img
image_raw_numpy = img.get_image_data_numpy()
spectral_container[:, i, :] = image_raw_numpy[339:639, 967:970]
spectral_camera_operation.image_dc = spectral_container.mean(axis=1)
# 如果点击“曝光/白板”按钮
if spectral_window_instance.sender().objectName() == 'wb_bt':
cam.start_acquisition()
for j in range(spectralNumber_wb):
for i in range(framenumber):
cam.get_image(img) # get data and pass them from camera to img
image_raw_numpy = img.get_image_data_numpy()
spectral_container[:, i, :] = image_raw_numpy[339:639, 967:970]
for i in range(framenumber):#去除暗电流
spectral_container[:, i, :] -= spectral_camera_operation.image_dc
# spectral_camera_operation.spectral_wb = spectral_container.mean(axis=1).mean(axis=1)
spectral_camera_operation.spectral_wb = spectral_container.mean(axis=1)
# 如果点击“采集”按钮,自动去除暗电流,并且转化成反射率
if spectral_window_instance.sender().objectName() == 'record_bt':
spectral_camera_operation.spectral = np.empty((300, 10)).astype(np.float) # 当第二次点击“采集”按钮时保证将上一次的数据清除
cam.start_acquisition()
for j in range(spectralNumber):
for i in range(framenumber):
cam.get_image(img) # get data and pass them from camera to img
image_raw_numpy = img.get_image_data_numpy()
spectral_container[:, i, :] = image_raw_numpy[339:639, 967:970]
for i in range(framenumber): #去除暗电流
spectral_container[:, i, :] -= spectral_camera_operation.image_dc
# 转反射率
# spectral_container = spectral_container.mean(axis=1).mean(axis=1).astype(
# np.float) / spectral_camera_operation.spectral_wb.astype(np.float)
for i in range(framenumber): #每一帧除以白板光谱
spectral_container[:, i, :] = spectral_container[:, i, :] / spectral_camera_operation.spectral_wb
spectral_container = spectral_container.mean(axis=1).mean(axis=1)
spectral_camera_operation.spectral[:, j] = spectral_container
# 画出光谱
spectral_window_instance.spectralFigure.plot(spectral_container)
spectral_window_instance.spectralFigure.draw()
# 保证当第二次点击“采集”按钮时spectral_container已经初始化
spectral_container = np.empty((300, framenumber, 3))
# # 计算波长
def calculate_wavelength(x):
wavelength = x * 1.999564 - 279.893
return wavelength
wavelength = np.empty(300)
for i in range(340, 640):
wavelength[i - 340] = calculate_wavelength(i)
# 保存光谱为txt文件
spectral_camera_operation.spectral = np.insert(spectral_camera_operation.spectral, 0, wavelength, axis=1)
for i in range(spectralNumber):
np.savetxt(spectral_camera_operation.fp + '\\' + spectral_camera_operation.fn + str(i) + '.txt',
spectral_camera_operation.spectral[:, [0, i + 1]], fmt='%f')
endtime = datetime.datetime.now()
print('光谱采集用时:%d' % (endtime - starttime).seconds)
# stop data acquisition
print('Stopping acquisition...')
cam.stop_acquisition()
@classmethod
def close_camera(cls, cam):
# stop communication
cam.close_device()
# 打开相机
def open_camera():
# create instance for first connected camera
cam = xiapi.Camera()
# start communication to open specific device, use: cam.open_device_by_SN('41305651')
print('Opening first camera...')
cam.open_device()
# 打开相机后,显示相机信息
print('SN: %s' % str(cam.get_device_sn(), encoding="utf-8"))
print('Device name: %s' % str(cam.get_device_name(), encoding="utf-8"))
print('Device name: %s' % str(cam.get_device_type(), encoding="utf-8"))
print('Instance path: %s' % str(cam.get_device_inst_path(),
encoding="utf-8")) # Returns device instance path in operating system.
print('Location path: %s' % str(cam.get_device_loc_path(), encoding="utf-8"))
print('Debug level: %s' % cam.get_debug_level())
print('Default number of threads per image processor: %d' % cam.get_proc_num_threads())
cam.set_proc_num_threads(8)
print('Current number of threads per image processor: %d' % cam.get_proc_num_threads())
print('Is horizontal flip enabled?, %s' % str(cam.is_horizontal_flip()))
print()
# This mode is supported by selected camera families: CB, MC, MT, MX
cam.set_acq_timing_mode('XI_ACQ_TIMING_MODE_FRAME_RATE_LIMIT')
mode_used = cam.get_acq_timing_mode()
if mode_used == 'XI_ACQ_TIMING_MODE_FRAME_RATE_LIMIT':
print('Mode is XI_ACQ_TIMING_MODE_FRAME_RATE_LIMIT')
else:
print('Mode is not XI_ACQ_TIMING_MODE_FRAME_RATE_LIMIT')
sys.exit()
return cam
if __name__ == '__main__':
app = QApplication(sys.argv)
camera = open_camera()
# 实例化3个窗口
enter_window_instance = enter_window()
enter_window_instance.setWindowTitle('主窗口')
image_window_instance = image_window()
image_window_instance.setWindowTitle('影像窗口')
spectral_window_instance = spectral_window()
spectral_window_instance.setWindowTitle('光谱窗口')
enter_window_instance.c.openinfo.emit()
# 从主窗口弹出影像窗口和光谱窗口
enter_window_instance.image_mode_bt.clicked.connect(image_window_instance.show)
enter_window_instance.spectral_mode_bt.clicked.connect(spectral_window_instance.show)
########################################################影像窗口操作########################################################################
# 设置曝光时间帧率设置放在image_window类中实现
img_e_bt = image_window_instance.exposureTime_bt
img_e_bt.clicked.connect(functools.partial(camera_operation.set_exposureTime, camera))
# 暗电流/白板
image_window_instance.dc_bt.clicked.connect(functools.partial(camera_operation.start_AcquireData, camera))
image_window_instance.wb_bt.clicked.connect(functools.partial(camera_operation.start_AcquireData, camera))
# 采集影像
image_window_instance.record_bt.clicked.connect(functools.partial(camera_operation.start_AcquireData, camera))
image_window_instance.focus_bt.clicked.connect(functools.partial(camera_operation.start_AcquireData, camera))
# 保存影像
image_window_instance.save_bt.clicked.connect(camera_operation.savedata)
########################################################光谱窗口操作########################################################################
# 设置曝光时间帧率设置放在image_window类中实现
spec_e_bt = spectral_window_instance.wb_bt
spec_e_bt.clicked.connect(functools.partial(spectral_camera_operation.set_exposureTime, camera))
# 暗电流/白板
spectral_window_instance.dc_bt.clicked.connect(functools.partial(spectral_camera_operation.start_AcquireData, camera))
spectral_window_instance.wb_bt.clicked.connect(functools.partial(spectral_camera_operation.start_AcquireData, camera))
# 采集光谱
spectral_window_instance.record_bt.clicked.connect(functools.partial(spectral_camera_operation.start_AcquireData, camera))
enter_window_instance.show()
sys.exit(app.exec_())

View File

@ -0,0 +1,48 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'arcus_control_ui.ui'
#
# Created by: PyQt5 UI code generator 5.13.0
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_arcus_ui(object):
def setupUi(self, arcus_ui):
arcus_ui.setObjectName("arcus_ui")
arcus_ui.resize(354, 171)
self.centralwidget = QtWidgets.QWidget(arcus_ui)
self.centralwidget.setObjectName("centralwidget")
self.left_btn = QtWidgets.QPushButton(self.centralwidget)
self.left_btn.setGeometry(QtCore.QRect(100, 90, 61, 21))
self.left_btn.setObjectName("left_btn")
self.right_btn = QtWidgets.QPushButton(self.centralwidget)
self.right_btn.setGeometry(QtCore.QRect(170, 90, 61, 23))
self.right_btn.setObjectName("right_btn")
self.speed_lineEdit = QtWidgets.QLineEdit(self.centralwidget)
self.speed_lineEdit.setGeometry(QtCore.QRect(101, 10, 131, 20))
self.speed_lineEdit.setObjectName("speed_lineEdit")
self.speed_ScrollBar = QtWidgets.QScrollBar(self.centralwidget)
self.speed_ScrollBar.setGeometry(QtCore.QRect(100, 40, 131, 20))
self.speed_ScrollBar.setOrientation(QtCore.Qt.Horizontal)
self.speed_ScrollBar.setObjectName("speed_ScrollBar")
arcus_ui.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(arcus_ui)
self.menubar.setGeometry(QtCore.QRect(0, 0, 354, 23))
self.menubar.setObjectName("menubar")
arcus_ui.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(arcus_ui)
self.statusbar.setObjectName("statusbar")
arcus_ui.setStatusBar(self.statusbar)
self.retranslateUi(arcus_ui)
QtCore.QMetaObject.connectSlotsByName(arcus_ui)
def retranslateUi(self, arcus_ui):
_translate = QtCore.QCoreApplication.translate
arcus_ui.setWindowTitle(_translate("arcus_ui", "MainWindow"))
self.left_btn.setText(_translate("arcus_ui", ""))
self.right_btn.setText(_translate("arcus_ui", ""))

View File

@ -0,0 +1,81 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>arcus_ui</class>
<widget class="QMainWindow" name="arcus_ui">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>354</width>
<height>171</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<widget class="QPushButton" name="left_btn">
<property name="geometry">
<rect>
<x>100</x>
<y>90</y>
<width>61</width>
<height>21</height>
</rect>
</property>
<property name="text">
<string>左</string>
</property>
</widget>
<widget class="QPushButton" name="right_btn">
<property name="geometry">
<rect>
<x>170</x>
<y>90</y>
<width>61</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>右</string>
</property>
</widget>
<widget class="QLineEdit" name="speed_lineEdit">
<property name="geometry">
<rect>
<x>101</x>
<y>10</y>
<width>131</width>
<height>20</height>
</rect>
</property>
</widget>
<widget class="QScrollBar" name="speed_ScrollBar">
<property name="geometry">
<rect>
<x>100</x>
<y>40</y>
<width>131</width>
<height>20</height>
</rect>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>354</width>
<height>23</height>
</rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -0,0 +1,47 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'enter_window.ui'
#
# Created by: PyQt5 UI code generator 5.13.0
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_enter_Window(object):
def setupUi(self, enter_Window):
enter_Window.setObjectName("enter_Window")
enter_Window.resize(651, 474)
self.centralwidget = QtWidgets.QWidget(enter_Window)
self.centralwidget.setObjectName("centralwidget")
self.image_mode_bt = QtWidgets.QPushButton(self.centralwidget)
self.image_mode_bt.setGeometry(QtCore.QRect(200, 180, 111, 51))
self.image_mode_bt.setObjectName("image_mode_bt")
self.spectral_mode_bt = QtWidgets.QPushButton(self.centralwidget)
self.spectral_mode_bt.setGeometry(QtCore.QRect(360, 180, 111, 51))
self.spectral_mode_bt.setObjectName("spectral_mode_bt")
self.camstatus_tb = QtWidgets.QTextBrowser(self.centralwidget)
self.camstatus_tb.setGeometry(QtCore.QRect(200, 240, 271, 81))
self.camstatus_tb.setObjectName("camstatus_tb")
enter_Window.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(enter_Window)
self.menubar.setGeometry(QtCore.QRect(0, 0, 651, 26))
self.menubar.setObjectName("menubar")
enter_Window.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(enter_Window)
self.statusbar.setObjectName("statusbar")
enter_Window.setStatusBar(self.statusbar)
self.actionwew_e = QtWidgets.QAction(enter_Window)
self.actionwew_e.setObjectName("actionwew_e")
self.retranslateUi(enter_Window)
QtCore.QMetaObject.connectSlotsByName(enter_Window)
def retranslateUi(self, enter_Window):
_translate = QtCore.QCoreApplication.translate
enter_Window.setWindowTitle(_translate("enter_Window", "主窗口"))
self.image_mode_bt.setText(_translate("enter_Window", "影像模式"))
self.spectral_mode_bt.setText(_translate("enter_Window", "光谱模式"))
self.actionwew_e.setText(_translate("enter_Window", "wew e"))

View File

@ -0,0 +1,73 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>enter_Window</class>
<widget class="QMainWindow" name="enter_Window">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>651</width>
<height>474</height>
</rect>
</property>
<property name="windowTitle">
<string>主窗口</string>
</property>
<widget class="QWidget" name="centralwidget">
<widget class="QPushButton" name="image_mode_bt">
<property name="geometry">
<rect>
<x>200</x>
<y>180</y>
<width>111</width>
<height>51</height>
</rect>
</property>
<property name="text">
<string>影像模式</string>
</property>
</widget>
<widget class="QPushButton" name="spectral_mode_bt">
<property name="geometry">
<rect>
<x>360</x>
<y>180</y>
<width>111</width>
<height>51</height>
</rect>
</property>
<property name="text">
<string>光谱模式</string>
</property>
</widget>
<widget class="QTextBrowser" name="camstatus_tb">
<property name="geometry">
<rect>
<x>200</x>
<y>240</y>
<width>271</width>
<height>81</height>
</rect>
</property>
</widget>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>651</width>
<height>26</height>
</rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/>
<action name="actionwew_e">
<property name="text">
<string>wew e</string>
</property>
</action>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -0,0 +1,231 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'image_Window.ui'
#
# Created by: PyQt5 UI code generator 5.13.0
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_image_Window(object):
def setupUi(self, image_Window):
image_Window.setObjectName("image_Window")
image_Window.setEnabled(True)
image_Window.resize(1181, 683)
image_Window.setMouseTracking(False)
image_Window.setAutoFillBackground(False)
image_Window.setSizeGripEnabled(False)
image_Window.setModal(False)
self.verticalLayout_7 = QtWidgets.QVBoxLayout(image_Window)
self.verticalLayout_7.setObjectName("verticalLayout_7")
self.groupBox_5 = QtWidgets.QGroupBox(image_Window)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.groupBox_5.sizePolicy().hasHeightForWidth())
self.groupBox_5.setSizePolicy(sizePolicy)
self.groupBox_5.setObjectName("groupBox_5")
self.horizontalLayout_4 = QtWidgets.QHBoxLayout(self.groupBox_5)
self.horizontalLayout_4.setObjectName("horizontalLayout_4")
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout_4.addItem(spacerItem)
self.splitter_3 = QtWidgets.QSplitter(self.groupBox_5)
self.splitter_3.setOrientation(QtCore.Qt.Horizontal)
self.splitter_3.setObjectName("splitter_3")
self.layoutWidget = QtWidgets.QWidget(self.splitter_3)
self.layoutWidget.setObjectName("layoutWidget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.layoutWidget)
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
self.verticalLayout.setObjectName("verticalLayout")
self.label = QtWidgets.QLabel(self.layoutWidget)
self.label.setObjectName("label")
self.verticalLayout.addWidget(self.label)
self.label_4 = QtWidgets.QLabel(self.layoutWidget)
self.label_4.setObjectName("label_4")
self.verticalLayout.addWidget(self.label_4)
self.layoutWidget1 = QtWidgets.QWidget(self.splitter_3)
self.layoutWidget1.setObjectName("layoutWidget1")
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.layoutWidget1)
self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.filepath_le = QtWidgets.QLineEdit(self.layoutWidget1)
self.filepath_le.setObjectName("filepath_le")
self.verticalLayout_2.addWidget(self.filepath_le)
self.filename_le = QtWidgets.QLineEdit(self.layoutWidget1)
self.filename_le.setObjectName("filename_le")
self.verticalLayout_2.addWidget(self.filename_le)
self.layoutWidget2 = QtWidgets.QWidget(self.splitter_3)
self.layoutWidget2.setObjectName("layoutWidget2")
self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.layoutWidget2)
self.verticalLayout_3.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_3.setObjectName("verticalLayout_3")
self.filepath_bt = QtWidgets.QPushButton(self.layoutWidget2)
self.filepath_bt.setObjectName("filepath_bt")
self.verticalLayout_3.addWidget(self.filepath_bt)
self.save_bt = QtWidgets.QPushButton(self.layoutWidget2)
self.save_bt.setObjectName("save_bt")
self.verticalLayout_3.addWidget(self.save_bt)
self.horizontalLayout_4.addWidget(self.splitter_3)
spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout_4.addItem(spacerItem1)
self.verticalLayout_7.addWidget(self.groupBox_5)
self.splitter = QtWidgets.QSplitter(image_Window)
self.splitter.setOrientation(QtCore.Qt.Horizontal)
self.splitter.setObjectName("splitter")
self.groupBox_3 = QtWidgets.QGroupBox(self.splitter)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.groupBox_3.sizePolicy().hasHeightForWidth())
self.groupBox_3.setSizePolicy(sizePolicy)
self.groupBox_3.setMinimumSize(QtCore.QSize(0, 0))
self.groupBox_3.setMaximumSize(QtCore.QSize(2000, 16777215))
self.groupBox_3.setObjectName("groupBox_3")
self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.groupBox_3)
self.verticalLayout_4.setObjectName("verticalLayout_4")
self.groupBox = QtWidgets.QGroupBox(self.groupBox_3)
self.groupBox.setObjectName("groupBox")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.groupBox)
self.horizontalLayout.setObjectName("horizontalLayout")
self.image_glo = QtWidgets.QGridLayout()
self.image_glo.setObjectName("image_glo")
self.horizontalLayout.addLayout(self.image_glo)
self.verticalLayout_4.addWidget(self.groupBox)
self.statu_tb = QtWidgets.QTextBrowser(self.groupBox_3)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.statu_tb.sizePolicy().hasHeightForWidth())
self.statu_tb.setSizePolicy(sizePolicy)
self.statu_tb.setMaximumSize(QtCore.QSize(8777215, 100))
self.statu_tb.setReadOnly(True)
self.statu_tb.setObjectName("statu_tb")
self.verticalLayout_4.addWidget(self.statu_tb)
self.groupBox_4 = QtWidgets.QGroupBox(self.splitter)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.groupBox_4.sizePolicy().hasHeightForWidth())
self.groupBox_4.setSizePolicy(sizePolicy)
self.groupBox_4.setObjectName("groupBox_4")
self.verticalLayout_5 = QtWidgets.QVBoxLayout(self.groupBox_4)
self.verticalLayout_5.setObjectName("verticalLayout_5")
self.groupBox_2 = QtWidgets.QGroupBox(self.groupBox_4)
self.groupBox_2.setObjectName("groupBox_2")
self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.groupBox_2)
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.focus_glo = QtWidgets.QGridLayout()
self.focus_glo.setObjectName("focus_glo")
self.horizontalLayout_2.addLayout(self.focus_glo)
self.verticalLayout_5.addWidget(self.groupBox_2)
self.groupBox_6 = QtWidgets.QGroupBox(self.groupBox_4)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.groupBox_6.sizePolicy().hasHeightForWidth())
self.groupBox_6.setSizePolicy(sizePolicy)
self.groupBox_6.setObjectName("groupBox_6")
self.horizontalLayout_5 = QtWidgets.QHBoxLayout(self.groupBox_6)
self.horizontalLayout_5.setObjectName("horizontalLayout_5")
self.groupBox_7 = QtWidgets.QGroupBox(self.groupBox_6)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.groupBox_7.sizePolicy().hasHeightForWidth())
self.groupBox_7.setSizePolicy(sizePolicy)
self.groupBox_7.setMaximumSize(QtCore.QSize(500, 500))
self.groupBox_7.setObjectName("groupBox_7")
self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.groupBox_7)
self.horizontalLayout_3.setObjectName("horizontalLayout_3")
self.verticalLayout_6 = QtWidgets.QVBoxLayout()
self.verticalLayout_6.setObjectName("verticalLayout_6")
self.label_3 = QtWidgets.QLabel(self.groupBox_7)
self.label_3.setAlignment(QtCore.Qt.AlignCenter)
self.label_3.setObjectName("label_3")
self.verticalLayout_6.addWidget(self.label_3)
self.focus_bt = QtWidgets.QPushButton(self.groupBox_7)
self.focus_bt.setObjectName("focus_bt")
self.verticalLayout_6.addWidget(self.focus_bt)
self.exposureTime_bt = QtWidgets.QPushButton(self.groupBox_7)
self.exposureTime_bt.setObjectName("exposureTime_bt")
self.verticalLayout_6.addWidget(self.exposureTime_bt)
self.label_5 = QtWidgets.QLabel(self.groupBox_7)
self.label_5.setAlignment(QtCore.Qt.AlignCenter)
self.label_5.setObjectName("label_5")
self.verticalLayout_6.addWidget(self.label_5)
self.wb_bt = QtWidgets.QPushButton(self.groupBox_7)
self.wb_bt.setObjectName("wb_bt")
self.verticalLayout_6.addWidget(self.wb_bt)
self.label_2 = QtWidgets.QLabel(self.groupBox_7)
self.label_2.setAlignment(QtCore.Qt.AlignCenter)
self.label_2.setObjectName("label_2")
self.verticalLayout_6.addWidget(self.label_2)
self.record_bt = QtWidgets.QPushButton(self.groupBox_7)
self.record_bt.setObjectName("record_bt")
self.verticalLayout_6.addWidget(self.record_bt)
self.horizontalLayout_3.addLayout(self.verticalLayout_6)
self.verticalLayout_8 = QtWidgets.QVBoxLayout()
self.verticalLayout_8.setObjectName("verticalLayout_8")
self.framerate_le = QtWidgets.QLineEdit(self.groupBox_7)
self.framerate_le.setReadOnly(False)
self.framerate_le.setObjectName("framerate_le")
self.verticalLayout_8.addWidget(self.framerate_le)
self.stop_focus_bt = QtWidgets.QPushButton(self.groupBox_7)
self.stop_focus_bt.setObjectName("stop_focus_bt")
self.verticalLayout_8.addWidget(self.stop_focus_bt)
self.exposureTime_le = QtWidgets.QLineEdit(self.groupBox_7)
self.exposureTime_le.setObjectName("exposureTime_le")
self.verticalLayout_8.addWidget(self.exposureTime_le)
self.gain_le = QtWidgets.QLineEdit(self.groupBox_7)
self.gain_le.setObjectName("gain_le")
self.verticalLayout_8.addWidget(self.gain_le)
self.dc_bt = QtWidgets.QPushButton(self.groupBox_7)
self.dc_bt.setObjectName("dc_bt")
self.verticalLayout_8.addWidget(self.dc_bt)
self.framenumber_le = QtWidgets.QLineEdit(self.groupBox_7)
self.framenumber_le.setObjectName("framenumber_le")
self.verticalLayout_8.addWidget(self.framenumber_le)
self.motor_bt = QtWidgets.QPushButton(self.groupBox_7)
self.motor_bt.setObjectName("motor_bt")
self.verticalLayout_8.addWidget(self.motor_bt)
self.stop_record_bt = QtWidgets.QPushButton(self.groupBox_7)
self.stop_record_bt.setObjectName("stop_record_bt")
self.verticalLayout_8.addWidget(self.stop_record_bt)
self.horizontalLayout_3.addLayout(self.verticalLayout_8)
self.horizontalLayout_5.addWidget(self.groupBox_7)
spacerItem2 = QtWidgets.QSpacerItem(261, 17, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout_5.addItem(spacerItem2)
self.verticalLayout_5.addWidget(self.groupBox_6)
self.verticalLayout_7.addWidget(self.splitter)
self.retranslateUi(image_Window)
QtCore.QMetaObject.connectSlotsByName(image_Window)
def retranslateUi(self, image_Window):
_translate = QtCore.QCoreApplication.translate
image_Window.setWindowTitle(_translate("image_Window", "影像窗口"))
self.groupBox_5.setTitle(_translate("image_Window", "GroupBox"))
self.label.setText(_translate("image_Window", "保存路径"))
self.label_4.setText(_translate("image_Window", "文件名"))
self.filepath_bt.setText(_translate("image_Window", "浏览"))
self.save_bt.setText(_translate("image_Window", "保存"))
self.groupBox_3.setTitle(_translate("image_Window", "GroupBox"))
self.groupBox.setTitle(_translate("image_Window", "图像"))
self.groupBox_4.setTitle(_translate("image_Window", "GroupBox"))
self.groupBox_2.setTitle(_translate("image_Window", "光谱"))
self.groupBox_6.setTitle(_translate("image_Window", "GroupBox"))
self.groupBox_7.setTitle(_translate("image_Window", "GroupBox"))
self.label_3.setText(_translate("image_Window", "帧率"))
self.focus_bt.setText(_translate("image_Window", "调焦"))
self.exposureTime_bt.setText(_translate("image_Window", "曝光"))
self.label_5.setText(_translate("image_Window", "gain"))
self.wb_bt.setText(_translate("image_Window", "白板"))
self.label_2.setText(_translate("image_Window", "帧数"))
self.record_bt.setText(_translate("image_Window", "采集"))
self.stop_focus_bt.setText(_translate("image_Window", "停止调焦"))
self.dc_bt.setText(_translate("image_Window", "暗电流"))
self.motor_bt.setText(_translate("image_Window", "马达"))
self.stop_record_bt.setText(_translate("image_Window", "停止采集"))

View File

@ -0,0 +1,377 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>image_Window</class>
<widget class="QDialog" name="image_Window">
<property name="enabled">
<bool>true</bool>
</property>
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1181</width>
<height>683</height>
</rect>
</property>
<property name="mouseTracking">
<bool>false</bool>
</property>
<property name="windowTitle">
<string>影像窗口</string>
</property>
<property name="autoFillBackground">
<bool>false</bool>
</property>
<property name="sizeGripEnabled">
<bool>false</bool>
</property>
<property name="modal">
<bool>false</bool>
</property>
<layout class="QVBoxLayout" name="verticalLayout_7">
<item>
<widget class="QGroupBox" name="groupBox_5">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>GroupBox</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QSplitter" name="splitter_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<widget class="QWidget" name="layoutWidget">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>保存路径</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_4">
<property name="text">
<string>文件名</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="layoutWidget">
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QLineEdit" name="filepath_le"/>
</item>
<item>
<widget class="QLineEdit" name="filename_le"/>
</item>
</layout>
</widget>
<widget class="QWidget" name="layoutWidget">
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QPushButton" name="filepath_bt">
<property name="text">
<string>浏览</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="save_bt">
<property name="text">
<string>保存</string>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QSplitter" name="splitter">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<widget class="QGroupBox" name="groupBox_3">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>2000</width>
<height>16777215</height>
</size>
</property>
<property name="title">
<string>GroupBox</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>图像</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<layout class="QGridLayout" name="image_glo"/>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QTextBrowser" name="statu_tb">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>8777215</width>
<height>100</height>
</size>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QGroupBox" name="groupBox_4">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>GroupBox</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_5">
<item>
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>光谱</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<layout class="QGridLayout" name="focus_glo"/>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_6">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>GroupBox</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<widget class="QGroupBox" name="groupBox_7">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>500</width>
<height>500</height>
</size>
</property>
<property name="title">
<string>GroupBox</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<layout class="QVBoxLayout" name="verticalLayout_6">
<item>
<widget class="QLabel" name="label_3">
<property name="text">
<string>帧率</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="focus_bt">
<property name="text">
<string>调焦</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="exposureTime_bt">
<property name="text">
<string>曝光</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_5">
<property name="text">
<string>gain</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="wb_bt">
<property name="text">
<string>白板</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string>帧数</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="record_bt">
<property name="text">
<string>采集</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_8">
<item>
<widget class="QLineEdit" name="framerate_le">
<property name="readOnly">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="stop_focus_bt">
<property name="text">
<string>停止调焦</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="exposureTime_le"/>
</item>
<item>
<widget class="QLineEdit" name="gain_le"/>
</item>
<item>
<widget class="QPushButton" name="dc_bt">
<property name="text">
<string>暗电流</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="framenumber_le"/>
</item>
<item>
<widget class="QPushButton" name="motor_bt">
<property name="text">
<string>马达</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="stop_record_bt">
<property name="text">
<string>停止采集</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>261</width>
<height>17</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -0,0 +1,94 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'spectral_Window.ui'
#
# Created by: PyQt5 UI code generator 5.13.0
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_spectral_Window(object):
def setupUi(self, spectral_Window):
spectral_Window.setObjectName("spectral_Window")
spectral_Window.resize(792, 523)
self.label = QtWidgets.QLabel(spectral_Window)
self.label.setGeometry(QtCore.QRect(54, 10, 51, 20))
self.label.setObjectName("label")
self.filepath_le = QtWidgets.QLineEdit(spectral_Window)
self.filepath_le.setGeometry(QtCore.QRect(131, 10, 261, 21))
self.filepath_le.setObjectName("filepath_le")
self.label_2 = QtWidgets.QLabel(spectral_Window)
self.label_2.setGeometry(QtCore.QRect(54, 40, 41, 20))
self.label_2.setObjectName("label_2")
self.filename_le = QtWidgets.QLineEdit(spectral_Window)
self.filename_le.setGeometry(QtCore.QRect(131, 40, 261, 21))
self.filename_le.setObjectName("filename_le")
self.filepath_bt = QtWidgets.QPushButton(spectral_Window)
self.filepath_bt.setGeometry(QtCore.QRect(401, 10, 71, 21))
self.filepath_bt.setObjectName("filepath_bt")
self.statu_tb = QtWidgets.QTextBrowser(spectral_Window)
self.statu_tb.setGeometry(QtCore.QRect(611, 210, 161, 301))
self.statu_tb.setObjectName("statu_tb")
self.tabWidget = QtWidgets.QTabWidget(spectral_Window)
self.tabWidget.setGeometry(QtCore.QRect(10, 70, 591, 441))
self.tabWidget.setObjectName("tabWidget")
self.tab = QtWidgets.QWidget()
self.tab.setObjectName("tab")
self.gridLayoutWidget = QtWidgets.QWidget(self.tab)
self.gridLayoutWidget.setGeometry(QtCore.QRect(0, 0, 581, 411))
self.gridLayoutWidget.setObjectName("gridLayoutWidget")
self.spe_glo = QtWidgets.QGridLayout(self.gridLayoutWidget)
self.spe_glo.setContentsMargins(0, 0, 0, 0)
self.spe_glo.setObjectName("spe_glo")
self.tabWidget.addTab(self.tab, "")
self.tab_2 = QtWidgets.QWidget()
self.tab_2.setObjectName("tab_2")
self.gridLayoutWidget_2 = QtWidgets.QWidget(self.tab_2)
self.gridLayoutWidget_2.setGeometry(QtCore.QRect(-1, -1, 581, 411))
self.gridLayoutWidget_2.setObjectName("gridLayoutWidget_2")
self.align_glo = QtWidgets.QGridLayout(self.gridLayoutWidget_2)
self.align_glo.setContentsMargins(0, 0, 0, 0)
self.align_glo.setObjectName("align_glo")
self.tabWidget.addTab(self.tab_2, "")
self.layoutWidget = QtWidgets.QWidget(spectral_Window)
self.layoutWidget.setGeometry(QtCore.QRect(610, 90, 195, 135))
self.layoutWidget.setObjectName("layoutWidget")
self.gridLayout = QtWidgets.QGridLayout(self.layoutWidget)
self.gridLayout.setContentsMargins(0, 0, 0, 0)
self.gridLayout.setObjectName("gridLayout")
self.align_bt = QtWidgets.QPushButton(self.layoutWidget)
self.align_bt.setObjectName("align_bt")
self.gridLayout.addWidget(self.align_bt, 0, 0, 1, 1)
self.stop_align_bt = QtWidgets.QPushButton(self.layoutWidget)
self.stop_align_bt.setObjectName("stop_align_bt")
self.gridLayout.addWidget(self.stop_align_bt, 0, 1, 1, 1)
self.wb_bt = QtWidgets.QPushButton(self.layoutWidget)
self.wb_bt.setObjectName("wb_bt")
self.gridLayout.addWidget(self.wb_bt, 1, 0, 1, 2)
self.dc_bt = QtWidgets.QPushButton(self.layoutWidget)
self.dc_bt.setObjectName("dc_bt")
self.gridLayout.addWidget(self.dc_bt, 2, 0, 1, 2)
self.record_bt = QtWidgets.QPushButton(self.layoutWidget)
self.record_bt.setObjectName("record_bt")
self.gridLayout.addWidget(self.record_bt, 3, 0, 1, 2)
self.retranslateUi(spectral_Window)
self.tabWidget.setCurrentIndex(0)
QtCore.QMetaObject.connectSlotsByName(spectral_Window)
def retranslateUi(self, spectral_Window):
_translate = QtCore.QCoreApplication.translate
spectral_Window.setWindowTitle(_translate("spectral_Window", "光谱窗口"))
self.label.setText(_translate("spectral_Window", "保存路径"))
self.label_2.setText(_translate("spectral_Window", "文件名"))
self.filepath_bt.setText(_translate("spectral_Window", "浏览"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("spectral_Window", "spe"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("spectral_Window", "align"))
self.align_bt.setText(_translate("spectral_Window", "align"))
self.stop_align_bt.setText(_translate("spectral_Window", "stop align"))
self.wb_bt.setText(_translate("spectral_Window", "曝光/白板"))
self.dc_bt.setText(_translate("spectral_Window", "暗电流"))
self.record_bt.setText(_translate("spectral_Window", "采集"))

View File

@ -0,0 +1,180 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>spectral_Window</class>
<widget class="QDialog" name="spectral_Window">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>792</width>
<height>523</height>
</rect>
</property>
<property name="windowTitle">
<string>光谱窗口</string>
</property>
<widget class="QLabel" name="label">
<property name="geometry">
<rect>
<x>54</x>
<y>10</y>
<width>51</width>
<height>20</height>
</rect>
</property>
<property name="text">
<string>保存路径</string>
</property>
</widget>
<widget class="QLineEdit" name="filepath_le">
<property name="geometry">
<rect>
<x>131</x>
<y>10</y>
<width>261</width>
<height>21</height>
</rect>
</property>
</widget>
<widget class="QLabel" name="label_2">
<property name="geometry">
<rect>
<x>54</x>
<y>40</y>
<width>41</width>
<height>20</height>
</rect>
</property>
<property name="text">
<string>文件名</string>
</property>
</widget>
<widget class="QLineEdit" name="filename_le">
<property name="geometry">
<rect>
<x>131</x>
<y>40</y>
<width>261</width>
<height>21</height>
</rect>
</property>
</widget>
<widget class="QPushButton" name="filepath_bt">
<property name="geometry">
<rect>
<x>401</x>
<y>10</y>
<width>71</width>
<height>21</height>
</rect>
</property>
<property name="text">
<string>浏览</string>
</property>
</widget>
<widget class="QTextBrowser" name="statu_tb">
<property name="geometry">
<rect>
<x>611</x>
<y>210</y>
<width>161</width>
<height>301</height>
</rect>
</property>
</widget>
<widget class="QTabWidget" name="tabWidget">
<property name="geometry">
<rect>
<x>10</x>
<y>70</y>
<width>591</width>
<height>441</height>
</rect>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="tab">
<attribute name="title">
<string>spe</string>
</attribute>
<widget class="QWidget" name="gridLayoutWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>581</width>
<height>411</height>
</rect>
</property>
<layout class="QGridLayout" name="spe_glo"/>
</widget>
</widget>
<widget class="QWidget" name="tab_2">
<attribute name="title">
<string>align</string>
</attribute>
<widget class="QWidget" name="gridLayoutWidget_2">
<property name="geometry">
<rect>
<x>-1</x>
<y>-1</y>
<width>581</width>
<height>411</height>
</rect>
</property>
<layout class="QGridLayout" name="align_glo"/>
</widget>
</widget>
</widget>
<widget class="QWidget" name="layoutWidget">
<property name="geometry">
<rect>
<x>610</x>
<y>90</y>
<width>195</width>
<height>135</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QPushButton" name="align_bt">
<property name="text">
<string>align</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QPushButton" name="stop_align_bt">
<property name="text">
<string>stop align</string>
</property>
</widget>
</item>
<item row="1" column="0" colspan="2">
<widget class="QPushButton" name="wb_bt">
<property name="text">
<string>曝光/白板</string>
</property>
</widget>
</item>
<item row="2" column="0" colspan="2">
<widget class="QPushButton" name="dc_bt">
<property name="text">
<string>暗电流</string>
</property>
</widget>
</item>
<item row="3" column="0" colspan="2">
<widget class="QPushButton" name="record_bt">
<property name="text">
<string>采集</string>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
<resources/>
<connections/>
</ui>