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

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

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

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

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

C++调用的案例

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


  1.  首先打开MVS,连接相机

既然要手调,那就必须要找到对应参数的名字才可以。阅读帮助文档可以知道有一系列方法,例如MV_CC_SetIntValue / MV_CC_SetEnumValue等,但是需要输入对应的参数键值

虽然文档里并没有写,但其实从MVS里是可以直接看到的,点击属性树(后面三个都不管用)。找到你想修改的值(英文)

python 海康工业相机二次开发 参数获取_第1张图片

 比如说我想修改自动曝光模式,找到对应的一栏

python 海康工业相机二次开发 参数获取_第2张图片

 可以看到第一行是键值,第二行是这里的数据类型(Enum),因此就要用Set(Get)EnumValue,下拉栏里是可选的值(off / once / continuous)。

如果换成曝光时间,也同理,只不过数据类型变成了Float。其他的都可以类推。

这个时候就可以进行对应的数值的获取和修改了。


 2. 案例展示

口说无凭,也不好解释。我这里想达成的需求是,用户自己改变相机的曝光模式。三种分别为,手动调整曝光时间、自动曝光、自动曝光并且自动增益

cam是MvCamera()

python 海康工业相机二次开发 参数获取_第3张图片

  • 对于第一种情况,就很简单了 ,只有一个参数修改的指令
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是会自己给你提醒的。就像这样 

python 海康工业相机二次开发 参数获取_第4张图片

  • 对于第二种情况,存在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)  # 增益归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)

你可能感兴趣的:(opencv,计算机视觉,python,qt5)