100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > python调用海康威视工业相机SDK实现图片采集

python调用海康威视工业相机SDK实现图片采集

时间:2022-10-06 21:30:54

相关推荐

python调用海康威视工业相机SDK实现图片采集

海康工业相机 图像采集流程

环境设置

先安装MVS,下载地址 海康机器人官网。

条件:Python+海康官方的mvs文件下的development/samples下的python文件夹

注意:相机连接后不要用官方app打开相机,不然python代码检测不到设备,代码在pycharm会提示报错,亲测能跑并能截取到图片(这个就是说,相机不要被其他软件链接占用啦,同一时刻,一个相机只能被一个软件链接)

需要添加模块MvImport的路径: 这是整个代码的核心,文件里面内容如下,具体可以下载MVS里面例程里面有:

手册上是通过C语言实现的:

海康调用C语言的动态链接库实现的python库

这些库文件在海康威视的MVS软件安装包里面,找一找就能找到。

两种方式 主动取流/回调出流

以主动取流为例流程如下:
主动获取图像有两种方式(两种方式不能同时使用)

方式一:调用MV_CC_StartGrabbing()开始采集,需要自己开启一个buffer,然后在应用层循环调用MV_CC_GetOneFrameTimeout()获取指定像素格式的帧数据,获取帧数据时上层应用程序需要根据帧率控制好调用该接口的频率。

方式二:调用MV_CC_StartGrabbing()开始采集,然后在应用层调用MV_CC_GetImageBuffer()获取指定像素格式的帧数据,然后调用MV_CC_FreeImageBuffer()释放buffer,获取帧数据时上层应用程序需要根据帧率控制好调用该接口的频率。主动取图方式使用的场景

主动取图方式需要先调用MV_CC_StartGrabbing()启动图像采集。上层应用程序需要根据帧率,控制好调用主动取图接口的频率。两种主动取图方式都支持设置超时时间,SDK内部等待直到有数据时返回,可以增加取流平稳性,适合用于对平稳性要求较高的场合。两种主动取图方式的区别

a、MV_CC_GetImageBuffer()需要与MV_CC_FreeImageBuffer()配套使用,当处理完取到的数据后,需要用MV_CC_FreeImageBuffer()接口将pstFrame内的数据指针权限进行释放。

b、MV_CC_GetImageBuffer()MV_CC_GetOneFrameTimeout()相比,有着更高的效率。且其取流缓存的分配是由sdk内部自动分配的,而MV_CC_GetOneFrameTimeout()接口是需要客户自行分配。

tlayerType = MV_GIGE_DEVICE | MV_USB_DEVICE | MV_UNKNOW_DEVICE | MV_1394_DEVICE | MV_CAMERALINK_DEVICE# 枚举网口、USB口、未知设备、cameralink 设备

通过MV_CC_EnumDevices(tlayerType, device_list)搜索存在的设备。

获取设备信息cast(device_list.pDeviceInfo[int(show_device_num)], POINTER(MV_CC_DEVICE_INFO)).contents

创建句柄cam = MvCamera()

获得设备的句柄cam.MV_CC_CreateHandle(device_info)

打开设备cam.MV_CC_OpenDevice(MV_ACCESS_Exclusive, 0)

获得设备的参数存在MVCC_INTVALUE()这个结构里面,cam.MV_CC_GetIntValue(“PayloadSize”, camera_int_param) # 数据包大小

获取图片的存储大小,还有长度

image_data_size = (c_ubyte * camera_int_param.nCurValue)()image_data_length = camera_int_param.nCurValue

开始抓流

grab_ret = cam.MV_CC_StartGrabbing()

图片信息存在下面的结构中

frame_info = MV_FRAME_OUT_INFO_EX()memset(byref(frame_info), 0, sizeof(frame_info))

获取流

cam.MV_CC_GetOneFrameTimeout(image_data_size, image_data_length, frame_info, 1000)

将图片格式转一转

nRGBSize = frame_info.nWidth * frame_info.nHeightconvert_param = MV_CC_PIXEL_CONVERT_PARAM()memset(byref(convert_param), 0, sizeof(convert_param))convert_param.nWidth = frame_info.nWidthconvert_param.nHeight = frame_info.nHeightconvert_param.pSrcData = image_data_sizeconvert_param.nSrcDataLen = frame_info.nFrameLenconvert_param.enSrcPixelType = frame_info.enPixelTypeconvert_param.enDstPixelType = frame_info.enPixelTypeconvert_param.pDstBuffer = (c_ubyte * nRGBSize)()convert_param.nDstBufferSize = nRGBSizeret = cam.MV_CC_ConvertPixelType(convert_param)

img_buff = (c_ubyte * convert_param.nDstLen)()cdll.msvcrt.memcpy(byref(img_buff), convert_param.pDstBuffer, convert_param.nDstLen)img = np.array(img_buff, dtype=np.int8)Img = img.reshape(1024, 1280)Img = cv.flip(Img, -1)Img = cv.flip(Img, -1)

取流核心代码如上,所有代码我就不放了,大家可以自己尝试一下印象更深。

常见SDK错误码解析

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