当前位置:   article > 正文

海康机器人:工业相机SDK二次开发_海康工业相机sdk二次开发

海康工业相机sdk二次开发

介绍

海康机器人官网链接:海康机器人-让机器更智能,让智能更普惠
根据购买设备的型号下载用户说明书

本人使用的是一款USB接口的M12工业相机

功能特性

  • 支持自动或手动调节增益、曝光时间、白平衡、Gamma、LUT校正等

  • 彩色相机植入优异的图像插值算法,更好的颜色还原

  • 通过USB3.0接口供电并传输数据

  • 兼容USB3 Vision协议和GenlCam标准,可接入第三方软件平台

订货型号

MV-CB060-10UC-S

外形尺寸

image.png

 产品参数

型号型号MV-CB060-10UC-S
名称600万像素USB 3.0板级相机,IMX178, 彩色, M12口, V4
性能传感器类型CMOS,卷帘快门
传感器型号IMX178
像元尺寸2.4 µm×2.4 µm
靶面尺寸1/1.8"
分辨率3072 × 2048
最大帧率60.9 fps @ 3072 × 2048 Bayer RG 8
动态范围66 dB
信噪比41.5 dB
增益0 dB ~ 24 dB
曝光时间8 μs ~ 1 sec
快门模式支持自动曝光、手动曝光、一键曝光以及 Global Reset、 Trigger Rolling
黑白/彩色彩色
像素格式Mono 8/10/12
Bayer RG 8/10/10Packed/12/12Packed
YUV422Packed, YUV422_YUYV_Packed
RGB 8,BGR 8
Binning支持1 × 1,2 × 2
下采样支持1 × 1,2 × 2,4 × 4
镜像支持水平镜像、垂直镜像
电气特性数据接口USB 3.0
数字I/O2路双向可配置非隔离IO(Line2,Line5)
供电支持USB 3.0供电
典型功耗1.8 W@5 VDC
结构镜头接口M12-Mount
外形尺寸35 mm × 35 mm × 8.6 mm
重量约 43.5 g
温度工作温度0~50℃,储藏温度-30~70℃
湿度20%~80%RH无冷凝
一般规范软件MVS或者兼容USB3 Vision协议的第三方软件
操作系统Windows XP/7/10/11 32/64bits,Linux 32/64bits
协议/标准USB3 Vision,GenlCam
认证CE,RoHS,KC

软件安装步骤

SDK安装

服务支持”>“下载中心”>“机器视觉”中下载MVS客户端安装包及SDK开发包

Ubuntu18.04系统安装

下载安装压缩包,并解压

查看README如下

说明:

树莓派 armhf架构,jetson 选aarch64,pc 机选x86_64,i386是32位pc。

armhf和aarch64区别就是armhf是armv7架构,如树莓派。aarch64是armv8架构,如jetson nano。

arm-none只有Samples,没有编译好的bin,也没有dpkg包,海康也没有提供源码,所以用不上。
 

实际安装:

方法1:

根据自己的系统选择解压相应的压缩包,打开INSTALL查看安装步骤

方法2:

或者使用deb的方式安装,方便卸载。tar和deb安装都可以

  1. sudo dpkg -i MVS-2.1.2_x86_64_20221208.deb
  2. # 删除用以下命令
  3. sudo dpkg -r mvs

如下图所示:

编译demo1

  1. source ~/.bashrc
  2. cd /opt/MVS/Samples/64/GrabImage
  3. make
  4. ./GrabImage

python+opencv:二次开发SDK

项目目录结构

其中MVImport从安装目录中拷贝,如下图所示,GrabImage_opencv.py:自定义代码(基于python+OpenCV实现取流,显示、保存视频等),util用于放入自定义的其他功能性脚本

相机控制步骤

相机控制分成枚举、打开、参数设置、关闭,销毁句柄五个步骤

主代码GrabImage_opencv.py

  1. # -- coding: utf-8 --
  2. """
  3. 2023.03.14
  4. author:alian
  5. function 海康威视摄像头取流
  6. 总结海康相机的取流步骤如下:
  7. 1 枚举
  8. 2 打开
  9. 3 参数设置
  10. 4 取流
  11. 5 关闭
  12. 6 销毁句柄
  13. """
  14. import sys
  15. import threading
  16. import os
  17. import termios
  18. import time
  19. import cv2
  20. import numpy as np
  21. from ctypes import *
  22. sys.path.append("/opt/MVS/Samples/64/Python/MvImport") # 导入相应SDK的库,实际安装位置绝对路径
  23. from MvImport.MvCameraControl_class import *
  24. def creat_video(): # 创建视频
  25. time_stamp = time.time()
  26. video_name = time.strftime("%Y%m%d%H%M%S", time.localtime(time_stamp))
  27. writer = cv2.VideoWriter("%s.mp4" % video_name, cv2.VideoWriter_fourcc(*"mp4v"), 30, (img_w, img_h))
  28. return writer,time_stamp
  29. # opencv转换显示
  30. def work_thread_opencv(cam=0, pData=0, nDataSize=0,video_length=None):
  31. img_w = 1920
  32. img_h = 1080
  33. stFrameInfo = MV_FRAME_OUT_INFO_EX()
  34. memset(byref(stFrameInfo), 0, sizeof(stFrameInfo))
  35. # 定义视频对象输出,自定义一段时间后新建视频文件,时间间隔设置为video_length
  36. writer, time_stamp = creat_video()
  37. while True:
  38. ret = cam.MV_CC_GetOneFrameTimeout(pData, nDataSize, stFrameInfo, 1000)
  39. if ret == 0:
  40. print("get one frame: Width[%d], Height[%d], PixelType[0x%x], nFrameNum[%d]" % (
  41. stFrameInfo.nWidth, stFrameInfo.nHeight, stFrameInfo.enPixelType, stFrameInfo.nFrameNum))
  42. print(time.time()-time_stamp)
  43. # 设置视频采集时长不大于video_length(以小时为单位)
  44. if video_length!=None and time.time()-time_stamp > video_length*3600:
  45. writer.release()
  46. writer, time_stamp = creat_video()
  47. # 设置相机输出像素格式,用OpenCV显示和保存视频数据
  48. img = np.asarray(pData) # 读取帧
  49. img = img.reshape(stFrameInfo.nHeight, stFrameInfo.nWidth, -1)
  50. img = cv2.resize(img,(img_w,img_h))
  51. img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
  52. import tkinter as tk # 获取屏幕尺寸,用于随屏幕分辨率自适应显示
  53. root = tk.Tk()
  54. width = root.winfo_screenwidth()
  55. height = root.winfo_screenheight()
  56. root.destroy()
  57. cv2.imshow('View', cv2.resize(img, (width, height)))
  58. writer.write(img) # 写入视频数据
  59. # 按Q退出
  60. if cv2.waitKey(24) & 0xFF == ord('q'):
  61. break
  62. else:
  63. print("no data[0x%x]" % ret)
  64. cv2.destroyAllWindows() # 释放所有显示图像窗口
  65. sys.exit()
  66. def press_any_key_exit(): # 任意按键退出程序
  67. fd = sys.stdin.fileno()
  68. old_ttyinfo = termios.tcgetattr(fd)
  69. new_ttyinfo = old_ttyinfo[:]
  70. new_ttyinfo[3] &= ~termios.ICANON
  71. new_ttyinfo[3] &= ~termios.ECHO
  72. termios.tcsetattr(fd, termios.TCSANOW, new_ttyinfo)
  73. try:
  74. os.read(fd, 7)
  75. except:
  76. pass
  77. finally:
  78. termios.tcsetattr(fd, termios.TCSANOW, old_ttyinfo)
  79. if __name__ == "__main__":
  80. deviceList = MV_CC_DEVICE_INFO_LIST()
  81. tlayerType = MV_GIGE_DEVICE | MV_USB_DEVICE
  82. # 1 枚举设备 | en:Enum device
  83. ret = MvCamera.MV_CC_EnumDevices(tlayerType, deviceList)
  84. if ret != 0:
  85. print("enum devices fail! ret[0x%x]" % ret)
  86. sys.exit()
  87. if deviceList.nDeviceNum == 0:
  88. print("find no device!")
  89. sys.exit()
  90. print("Find %d devices!" % deviceList.nDeviceNum)
  91. nConnectionNum = 0
  92. # 2 打开
  93. # 2.1 创建相机实例 | en:Creat Camera Object
  94. cam = MvCamera()
  95. # ch:选择设备并创建句柄| en:Select device and create handle
  96. stDeviceList = cast(deviceList.pDeviceInfo[int(nConnectionNum)], POINTER(MV_CC_DEVICE_INFO)).contents
  97. ret = cam.MV_CC_CreateHandle(stDeviceList)
  98. if ret != 0:
  99. print("create handle fail! ret[0x%x]" % ret)
  100. sys.exit()
  101. # 2.2 打开设备 | en:Open device
  102. ret = cam.MV_CC_OpenDevice(MV_ACCESS_Exclusive, 0)
  103. if ret != 0:
  104. print("open device fail! ret[0x%x]" % ret)
  105. sys.exit()
  106. # 3 参数设置
  107. # 3.1 设置触发模式为off | en:Set trigger mode as off
  108. ret = cam.MV_CC_SetEnumValue("TriggerMode", MV_TRIGGER_MODE_OFF)
  109. if ret != 0:
  110. print("set trigger mode fail! ret[0x%x]" % ret)
  111. sys.exit()
  112. # 3.2 获取数据包大小 | en:Get payload size
  113. stParam = MVCC_INTVALUE()
  114. memset(byref(stParam), 0, sizeof(MVCC_INTVALUE))
  115. ret = cam.MV_CC_GetIntValue("PayloadSize", stParam)
  116. if ret != 0:
  117. print("get payload size fail! ret[0x%x]" % ret)
  118. sys.exit()
  119. nPayloadSize = stParam.nCurValue
  120. # 4 开始取流 | en:Start grab image
  121. ret = cam.MV_CC_StartGrabbing()
  122. if ret != 0:
  123. print("start grabbing fail! ret[0x%x]" % ret)
  124. sys.exit()
  125. # 将PayloadSize的uint数据转为可供numpy处理的数据,后面就可以用numpy将其转化为numpy数组格式。
  126. data_buf = (c_ubyte * nPayloadSize)()
  127. try:
  128. hThreadHandle = threading.Thread(target=work_thread_opencv, args=(cam, data_buf, nPayloadSize))
  129. hThreadHandle.start()
  130. hThreadHandle.join()
  131. except:
  132. print("error: unable to start thread")
  133. # 5 关闭
  134. # 5.1 停止取流 | en:Stop grab image
  135. ret = cam.MV_CC_StopGrabbing()
  136. if ret != 0:
  137. print("stop grabbing fail! ret[0x%x]" % ret)
  138. del data_buf
  139. sys.exit()
  140. # 5.2 关闭设备 | Close device
  141. ret = cam.MV_CC_CloseDevice()
  142. if ret != 0:
  143. print("close deivce fail! ret[0x%x]" % ret)
  144. del data_buf
  145. sys.exit()
  146. # 6 销毁句柄 | Destroy handle
  147. ret = cam.MV_CC_DestroyHandle()
  148. if ret != 0:
  149. print("destroy handle fail! ret[0x%x]" % ret)
  150. del data_buf
  151. sys.exit()
  152. del data_buf

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/709845
推荐阅读
相关标签
  

闽ICP备14008679号