对于调用海康相机的整个流程,下面的这个博客说的很详细了,我一开始也是看的这个
python调用海康工业相机并用opencv显示(整体实现)_J&A~ing的博客-CSDN博客_python调用海康工业相机
众所周知,MVS里面可以自己调整参数 ,例如曝光时间,增益等,点一下输一个值就能解决问题了。
但是如果我们想用自己打包的用户界面,让用户输入数值或者模式等,然后不经过MVS的点击操作直接改变。这种情况就需要我们自己写了。网上(以及帮助文档)有C++的参数获取案例,没办法我C++写的一般,本文用的是PyQt5+MV-CS060-GM10-PRO进行调用
C++调用的案例
海康工业相机参数设置与获取_青山笑我依旧在的博客-CSDN博客_海康工业相机参数设置
既然要手调,那就必须要找到对应参数的名字才可以。阅读帮助文档可以知道有一系列方法,例如MV_CC_SetIntValue / MV_CC_SetEnumValue等,但是需要输入对应的参数键值
虽然文档里并没有写,但其实从MVS里是可以直接看到的,点击属性树(后面三个都不管用)。找到你想修改的值(英文)
比如说我想修改自动曝光模式,找到对应的一栏
可以看到第一行是键值,第二行是这里的数据类型(Enum),因此就要用Set(Get)EnumValue,下拉栏里是可选的值(off / once / continuous)。
如果换成曝光时间,也同理,只不过数据类型变成了Float。其他的都可以类推。
这个时候就可以进行对应的数值的获取和修改了。
2. 案例展示
口说无凭,也不好解释。我这里想达成的需求是,用户自己改变相机的曝光模式。三种分别为,手动调整曝光时间、自动曝光、自动曝光并且自动增益
cam是MvCamera()
if self.exposure_mode.currentText() == '手动曝光(ms)':
self.info_text.setText('曝光模式设置中...') # info_text是我设置的一个状态信息栏,属于QLineEdit
try:
ans_exposure = float(self.exposure_time_text.text()) # 时间输入栏,setReadOnly==False
exposure_time = ans_exposure * 1000
except:
exposure_time = self.exposure_time * 1000
ret = cam.MV_CC_SetEnumValue('ExposureAuto', MV_EXPOSURE_AUTO_MODE_OFF)
ret = cam.MV_CC_SetEnumValue('GainAuto', MV_GAIN_MODE_OFF)
ret = cam.MV_CC_SetFloatValue("Gain", 0)
ret = cam.MV_CC_SetFloatValue("ExposureTime", exposure_time)
self.info_text.setText('曝光模式设置完成')
time.sleep(1)
实现的就是输入浮点型的时间值然后赋值(这里我提前将自动模式调整为OFF,增益调整为0)。对于Set类方法,直接给值就行了(Get类是不行的,后面会讲到)
这里要注意,对于Enum的数据类型,在调用MV_CC_SetEnumValue时,第二个参数是要用SDK所给的属性的。如果你在开头把相关的文件都导进来了的话,IDE是会自己给你提醒的。就像这样
elif self.exposure_mode.currentText() == '自动曝光':
self.exposure_time_text.setReadOnly(True)
self.info_text.setText('曝光模式设置中...')
cnt_exposure_time = MVCC_FLOATVALUE() # 定义专用数据类型
memset(byref(cnt_exposure_time), 0, sizeof(MVCC_FLOATVALUE)) # 定义结构体
ret = cam.MV_CC_SetFloatValue('Gain', 0) # 增益归0
ret = cam.MV_CC_SetEnumValue('ExposureAuto', MV_EXPOSURE_AUTO_MODE_CONTINUOUS)
time.sleep(3) # 别人文章的经验,自动曝光3秒后获得对应的值,即可关闭
ret = cam.MV_CC_GetFloatValue("ExposureTime", cnt_exposure_time) # 用这个特殊的数据结构获取值
ret = cam.MV_CC_SetEnumValue('ExposureAuto', MV_EXPOSURE_AUTO_MODE_OFF)
ret = cam.MV_CC_SetFloatValue("ExposureTime", cnt_exposure_time.fCurValue) # fCurValue转换并赋值
self.info_text.setText('曝光模式设置完成')
time.sleep(1)
可以看出,Set和Get所接受值的数据类型是完全不一样的,需要特别注意
elif self.exposure_mode.currentText() == '自动曝光+自动增益':
self.exposure_time_text.setReadOnly(True)
self.info_text.setText('曝光模式设置中...')
cnt_exposure_time, cnt_gain_value = MVCC_FLOATVALUE(), MVCC_FLOATVALUE()
memset(byref(cnt_exposure_time), 0, sizeof(MVCC_FLOATVALUE))
memset(byref(cnt_gain_value), 0, sizeof(MVCC_FLOATVALUE))
ret = cam.MV_CC_SetEnumValue('ExposureMode', MV_EXPOSURE_AUTO_MODE_CONTINUOUS)
time.sleep(3)
ret = cam.MV_CC_SetEnumValue('GainAuto', MV_GAIN_MODE_CONTINUOUS)
time.sleep(3)
ret = cam.MV_CC_GetFloatValue("ExposureTime", cnt_exposure_time)
ret = cam.MV_CC_GetFloatValue("Gain", cnt_gain_value)
ret = cam.MV_CC_SetEnumValue('GainAuto', MV_GAIN_MODE_OFF)
ret = cam.MV_CC_SetEnumValue('ExposureAuto', MV_EXPOSURE_AUTO_MODE_OFF)
ret = cam.MV_CC_SetFloatValue("ExposureTime", cnt_exposure_time.fCurValue)
ret = cam.MV_CC_SetFloatValue("Gain", cnt_gain_value.fCurValue)
self.info_text.setText('曝光模式设置完成')
time.sleep(1)