python 调用海康工业相机调试后出现被占用问题

问题描述:
在使用海康工业网口相机开发过程中,调试阶段异常结束程序调试时,经常出现相机被占用的异常情况,无论是使用海康的客户端界面连接相机还是使用调试代码连接相机,都没有权限再次打开相机,需要相机断电或者长时间等待(60s)才能正常打开相机;

问题出现时,在海康客户端界面有如下红色框图中的状态,该状态表示相机被占用,无法连接调用;

python 调用海康工业相机调试后出现被占用问题_第1张图片

原因分析:
网口相机,有一种心跳保护机制,在相机链接状态,为检测控制通道是否处于活跃状态,SDK会定时500ms发送一个GVSP指令给相机,相机收到指令后,同时会回复一个GVSP命令;

这样一来一回就确保了相机被指定的软件打开,防止意外掉线的情况;

相机默认3s的心跳超时时间,如果相机连续6次没有收到sdk的心跳数据包,那么相机就会主动清空的当前的控制权限,使相机能够被其他软件链接;

解决方案:
在 opendevice 之后,设置相机心跳时间值范围是3s-60s。减小心跳时间可减少等待时间,这样就可以减小因为异常退出调试程序导致的相机被占用时间,降低调试过程中的耗时;

具体参数在客户端显示如下:

python 调用海康工业相机调试后出现被占用问题_第2张图片

可以在客户端中修改相关值,但是在每次相机重新上电之后,该值就会再次变为 60s,因而建议直接在每次调用相机时,连接上相机之后写入,这样每次调用就不会再出现以上问题,如下所示:

    if stDeviceList.nTLayerType == MV_GIGE_DEVICE:
        stParam = 30000
        ret = cam.MV_CC_SetIntValueEx("GevHeartbeatTimeout", stParam)
        if ret != 0:
            print("set GevHeartbeatTimeout fail! ret[0x%x]" %  ret)
            sys.exit()
 
 
        nPacketSize = cam.MV_CC_GetOptimalPacketSize()
        if int(nPacketSize) > 0:
            ret = cam.MV_CC_SetIntValue("GevSCPSPacketSize",nPacketSize)
            if ret != 0:
                print ("Warning: Set Packet Size fail! ret[0x%x]" % ret)
        else:
            print ("Warning: Get Packet Size fail! ret[0x%x]" % nPacketSize)

因为该参数只对网口相机有作用,可以将该设置部分添加到探测网络最佳包大小部分(官方例程中有探测网络最佳包大小的代码,可以找到相关位置添加)

你可能感兴趣的:(海康机器人,Python,计算机视觉,自动驾驶,人工智能)