1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > python 海康工业相机二次开发 参数获取

python 海康工业相机二次开发 参数获取

时间:2021-08-06 09:46:55

相关推荐

python 海康工业相机二次开发 参数获取

对于调用海康相机的整个流程,下面的这个博客说的很详细了,我一开始也是看的这个

python调用海康工业相机并用opencv显示(整体实现)_J&A~ing的博客-CSDN博客_python调用海康工业相机

众所周知,MVS里面可以自己调整参数 ,例如曝光时间,增益等,点一下输一个值就能解决问题了。

但是如果我们想用自己打包的用户界面,让用户输入数值或者模式等,然后不经过MVS的点击操作直接改变。这种情况就需要我们自己写了。网上(以及帮助文档)有C++的参数获取案例,没办法我C++写的一般,本文用的是PyQt5+MV-CS060-GM10-PRO进行调用

C++调用的案例

海康工业相机参数设置与获取_青山笑我依旧在的博客-CSDN博客_海康工业相机参数设置

首先打开MVS,连接相机

既然要手调,那就必须要找到对应参数的名字才可以。阅读帮助文档可以知道有一系列方法,例如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是我设置的一个状态信息栏,属于QLineEdittry:ans_exposure = float(self.exposure_time_text.text()) # 时间输入栏,setReadOnly==Falseexposure_time = ans_exposure * 1000except:exposure_time = self.exposure_time * 1000ret = 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是会自己给你提醒的。就像这样

对于第二种情况,存在Get指令,需要提前定义相关的结构体(不能用Python的数据类型)

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) # 增益归0ret = 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)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。