前一段时间做项目用的是海康工业相机,想在python代码中调用相机拍照,参考了这篇文章:python调用海康工业相机并用opencv显示(整体实现)_J&A~ing的博客-CSDN博客_python调用海康工业相机
代码大致是需要循环调用相机拍照,以拍到的照片作为条件调用Vision Master软件特定模板。在进行一次循环之后,发现运行代码出现了如下问题:
no data[0x80000007]
通过查询海康的官方文件,发现状态码0x80000007表示无数据。
相机无数据的原因很多,无法判断是什么原因导致的。但是发现,每次重启相机后的第一此循环都是正常的,然后都会在第一次循环之后出现这个问题。于是就可以猜测为相机参数设置的问题。
在每次重启相机运行代码之前,连接相机打开MVS,会发现相机的Trigger Mode(触发模式)是Off的(即为内触发)。此时不管是用MVS还是用python代码打开相机都没有任何问题。
然而在调用Vision Master软件,并在VM中使用相机后,再打开MVS,发现相机的Trigger Mode变为On了(即为外触发)。此时用MVS或者用python打开相机都会无数据。
因此,为了解决这个问题,需要在代码中让相机在捕捉画面之前将Trigger Mode更改为Off。
def main():
# 枚举设备
deviceList = enum_devices(device=0, device_way=False)
# 判断不同类型设备
identify_different_devices(deviceList)
# 输入需要被连接的设备
nConnectionNum = input_num_camera(deviceList)
# 创建相机实例并创建句柄,(设置日志路径)
cam, stDeviceList = creat_camera(deviceList, nConnectionNum, log=False)
# decide_divice_on_line(cam) ==============
# 打开设备
open_device(cam)
# ch:设置触发模式为off | en:Set trigger mode as off
ret = cam.MV_CC_SetEnumValue("TriggerMode", MV_TRIGGER_MODE_OFF)
# # 设置缓存节点个数
# set_image_Node_num(cam, Num=10)
# # 设置取流策略
# set_grab_strategy(cam, grabstrategy=2, outputqueuesize=10)
# 设置设备的一些参数
# set_Value(cam, param_type="bool_value", node_name="TriggerCacheEnable", node_value=1)
# 获取设备的一些参数
# get_value = get_Value(cam , param_type = "int_value" , node_name = "PayloadSize")
stdcall = input("回调方式取流显示请输入 0 主动取流方式显示请输入 1:")
if int(stdcall) == 0:
# 回调方式抓取图像
call_back_get_image(cam)
# 开启设备取流
start_grab_and_get_data_size(cam)
# 当使用 回调取流时,需要在此处添加
print("press a key to stop grabbing.")
msvcrt.getch()
# 关闭设备与销毁句柄
close_and_destroy_device(cam)
elif int(stdcall) == 1:
# 开启设备取流
start_grab_and_get_data_size(cam)
# 主动取流方式抓取图像
access_get_image(cam, active_way="getImagebuffer")
# 关闭设备与销毁句柄
close_and_destroy_device(cam)
这样一来问题就解决了!
关于海康相机的触发模式可以参考这篇文章:海康相机的触发模式_zxmyoung的博客-CSDN博客


![python调用海康工业相机并用opencv显示 出现no data[0x80000007] python调用海康工业相机并用opencv显示 出现no data[0x80000007]](http://www.mshxw.com/aiimages/31/269318.png)
