相关文章推荐
很拉风的香菜  ·  Unity 之 ...·  1 年前    · 
热心的大熊猫  ·  python怎么爬js网站 ...·  1 年前    · 
爱喝酒的牙膏  ·  按数字递增(1~xx, ...·  1 年前    · 
海康工业相机 图像采集流程

环境设置
先安装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 设备
  1. 通过MV_CC_EnumDevices(tlayerType, device_list)搜索存在的设备。

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

  3. 创建句柄cam = MvCamera()

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

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

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

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

    image_data_size = (c_ubyte * camera_int_param.nCurValue)()
    image_data_length = camera_int_param.nCurValue
    
  8. 开始抓流

    grab_ret = cam.MV_CC_StartGrabbing()
    
  9. 图片信息存在下面的结构中

    frame_info = MV_FRAME_OUT_INFO_EX()
    memset(byref(frame_info), 0, sizeof(frame_info))
    
  10. 获取流

    cam.MV_CC_GetOneFrameTimeout(image_data_size, image_data_length, frame_info, 1000)
    
  11. 将图片格式转一转

    nRGBSize = frame_info.nWidth * frame_info.nHeight
    convert_param = MV_CC_PIXEL_CONVERT_PARAM()
    memset(byref(convert_param), 0, sizeof(convert_param))
    convert_param.nWidth = frame_info.nWidth
    convert_param.nHeight = frame_info.nHeight
    convert_param.pSrcData = image_data_size
    convert_param.nSrcDataLen = frame_info.nFrameLen
    convert_param.enSrcPixelType = frame_info.enPixelType
    convert_param.enDstPixelType = frame_info.enPixelType
    convert_param.pDstBuffer = (c_ubyte * nRGBSize)()
    convert_param.nDstBufferSize = nRGBSize
    ret = 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错误码解析

    只有打开相机以后,才能对相机参数进行设置。 3、选择内触发采集模式或者外触发采集模式; 内触发采集包括连续采集和单帧采集,外触发包括软触发和硬触发两种方式。它们两者的区别是后者需要发送触发命令,才能够采集到图像信息。 4、打开采集流; 5、取流抓图 如果是内触发采集模式,则打开采集流就可以采集到图像,如果是外触发采集模式,还
    通过python调用海康威视工业摄像头并进行图像存储问题(数据流获取问题未能解决) 先说情况,本人是做视觉检测的需要高倍率摄像头进行实时检测,也就是需要深度学习进行图片数据处理,但是这个又是python来进行分析,而海康威视主要程序代码是以C为主的,传过来的数据我也尝试的去解析都是不能转化成python的BGR图像。 具体参照了:通过cv2调用海康威视摄像头,但这个不能调用工业摄像头,通过官方给一个400什么软件要激活摄像头,可是却并不能检测到工业摄像头,通过mvs软件调用到摄像头地址进行测试也无法获取到摄
    搜罗了网上一些关于如何在python实现海康威视相机的连接与画面播放的资料,最直接的方式是通过rtsp流来实现海康的rtsp协议格式如下(参考:海康相机使用RTSP): rtsp://[username]:[passwd]@[ip]:[port]/[codec]/[channel]/[subtype]/av_stream rtsp://admin:12345@192.168....
    Visual Studio 2017 硬件:DS-2CD3T86FWDV2-I5S 相机SDK:CH-HCNetSDKV6.1.6.45_build20210302_win64 首先,海康网络相机的读取和工业相机不是同一个SDK包,工业相机SDK包去海康机器人下载,网络相机的SDK包去海康威视下载。工业相机控制软件MVS目录下有python SDK包使用示例,非
    这里写自定义目录标题本文参考以下博文加自己的实践,发现有些步骤是不必要的,例如不需要为opencv等第三方库指定路径运行环境:准备工作1、海康SDK下载2、下载安装vcpkg3、安装Swig4、下载OpenCV-swig接口文件 本文参考以下博文加自己的实践,发现有些步骤是不必要的,例如不需要为opencv等第三方库指定路径 https://blog.csdn.net/c20081052/article/details/95082377 https://www.ryannn.com/archives/hi
    使用windows进行YOLO8训练时报错ForkingPickler(file, protocol).dump(obj)BrokenPipeError: [Errno 32] BrokenPipe python实现OPCUA客户端和服务器