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 设备
  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错误码解析

  • 1
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
### 回答1: 要在Windows下使用Python调用海康威视网络摄像头SDK,可以按照以下步骤操作: 1. 安装海康威视网络摄像头SDK:首先,从海康威视官方网站下载并安装最新版本的SDK。确保SDK与你的Python版本兼容。 2. 设置环境变量:打开控制面板,进入系统属性,点击“高级系统设置”,选择“环境变量”。在系统变量中,找到“Path”变量,并将SDK的安装路径添加到该变量中。这样Python才能找到SDK的库文件。 3. 安装Python海康威视SDK库:通过pip安装Python海康威视SDK库,可以在命令提示符中运行以下命令: ``` pip install hikvisionapi ``` 这样就能将海康威视SDK库安装到Python环境中。 4. 使用Python调用SDK:在Python脚本中导入SDK库并使用其中的函数和类来调用摄像头功能。例如,你可以使用SDK提供的函数初始化摄像头设备、打开视频流、进行图像处理等操作。 需要注意的是,在使用SDK之前,你需要先了解SDK提供的函数和类的使用方法。可以参考SDK的官方文档或样例代码来了解如何正确地调用SDK的各项功能。 总之,通过安装SDK、设置环境变量、安装PythonSDK库,并使用Python脚本来调用SDK的函数和类,你就能在Windows下使用Python调用海康威视网络摄像头SDK了。 ### 回答2: 在Windows操作系统下,可以使用Python调用海康威视网络摄像头SDK实现摄像头的控制和影像数据的获取。下面是一个简单的示例代码: 首先,确保已经安装了Python和相应的海康威视网络摄像头SDK。 ```python # 导入相关库 from ctypes import * # 加载SDK的动态链接库 hk_sdk = cdll.LoadLibrary('hk_sdk.dll') # 设置登录参数 addr = b'IP地址' # 摄像头的IP地址 port = 8000 # 摄像头的端口号 user = b'用户名' # 登录用户名 password = b'密码' # 登录密码 # 登录摄像头 login_info = hk_sdk.NET_DVR_USER_LOGIN_INFO() # 定义登录信息结构体 login_info.sDeviceAddress = addr # 摄像头的IP地址 login_info.wPort = port # 摄像头的端口号 login_info.sUserName = user # 登录用户名 login_info.sPassword = password # 登录密码 login_info.cbLoginResult = None # 登录结果回调函数 login_info.pUser = None # 用户参数 lUserID = hk_sdk.NET_DVR_Login_V40(byref(login_info), None) # 调用登录函数,获取登录ID # 检查登录是否成功 if lUserID < 0: print('设备登录失败') hk_sdk.NET_DVR_Cleanup() # 释放资源 else: print('设备登录成功') # 进行相关操作,如实时预览或录像等 # 登出摄像头 hk_sdk.NET_DVR_Logout_V30(lUserID) hk_sdk.NET_DVR_Cleanup() # 释放资源 ``` 以上代码首先通过`cdll.LoadLibrary()`函数加载SDK的动态链接库。然后创建一个`NET_DVR_USER_LOGIN_INFO`结构体,并设置登录参数,包括IP地址、端口号、用户名和密码。接着调用`NET_DVR_Login_V40()`函数进行登录,并获取登录ID。如果登录成功,则可以进行相关操作,如实时预览或录像等。最后,调用`NET_DVR_Logout_V30()`函数登出摄像头,并使用`NET_DVR_Cleanup()`函数释放资源。 需要注意的是,具体的操作和功能需根据海康威视网络摄像头SDK的文档进行相关配置和调用

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jin·

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值