• Python对接海康威视机器视觉工业相机


    一、下载MVS客户端

    海康机器人-机器视觉-下载中心

    二、解压并安装MVS客户端

    三、找到MVS示例代码(代码在MVS的安装位置)

    工业相机只允许单条连接,也就是说MVS如果连接了相机,python代码就无法获取数据,此时必须退出MVS客户端

    四、使用Pycharm打开Python代码示例文件夹

    如果觉得爆红难受,将MvImport文件夹中的五个文件,拷贝到BasicDemo文件夹下即可。

    博主这里出现了一个警告:获取不到相机参数。忽略掉即可。

    五、获取相机图像

    安装一下opencv

    pip3 install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple

    相机工具类(读者直接复制)HKCamera_class.py

    1. import sys
    2. from ctypes import *
    3. import numpy as np
    4. import cv2
    5. # 这里要根据个人情况进行修改 TODO
    6. sys.path.append("E:\MVS_STD_4.2.1_230921\MVS\Development\Samples\Python\MvImport") # 打开MVS中的MvImport文件,对于不同系统打开的文件路径跟随实际文件路径变化即可
    7. from MvCameraControl_class import * # 调用了MvCameraControl_class.py文件
    8. class HKCamera():
    9. def __init__(self, CameraIdx=0, log_path=None, CameraIp=""):
    10. self.name = "HKCamera"
    11. deviceList = self.enum_devices()
    12. strModeName = ""
    13. TargetCamera = None
    14. for i in range(0, deviceList.nDeviceNum):
    15. mvcc_dev_info = cast(deviceList.pDeviceInfo[i], POINTER(MV_CC_DEVICE_INFO)).contents
    16. nip1 = ((mvcc_dev_info.SpecialInfo.stGigEInfo.nCurrentIp & 0xff000000) >> 24)
    17. nip2 = ((mvcc_dev_info.SpecialInfo.stGigEInfo.nCurrentIp & 0x00ff0000) >> 16)
    18. nip3 = ((mvcc_dev_info.SpecialInfo.stGigEInfo.nCurrentIp & 0x0000ff00) >> 8)
    19. nip4 = (mvcc_dev_info.SpecialInfo.stGigEInfo.nCurrentIp & 0x000000ff)
    20. Devip = "%d.%d.%d.%d" % (nip1, nip2, nip3, nip4)
    21. if Devip == CameraIp:
    22. TargetCamera = i
    23. self.camera = self.open_camera(deviceList=deviceList, CameraIdx=TargetCamera, log_path=log_path)
    24. # self.start_camera()
    25. def __del__(self):
    26. if self.camera is None:
    27. return
    28. # 停止取流
    29. # ret = self.camera.MV_CC_StopGrabbing()
    30. # if ret != 0:
    31. # raise Exception("stop grabbing fail! ret[0x%x]" % ret)
    32. # 关闭设备
    33. ret = self.camera.MV_CC_CloseDevice()
    34. if ret != 0:
    35. raise Exception("close deivce fail! ret[0x%x]" % ret)
    36. # 销毁句柄
    37. ret = self.camera.MV_CC_DestroyHandle()
    38. if ret != 0:
    39. raise Exception("destroy handle fail! ret[0x%x]" % ret)
    40. @staticmethod
    41. def enum_devices(device=0, device_way=False):
    42. """
    43. device = 0 枚举网口、USB口、未知设备、cameralink 设备
    44. device = 1 枚举GenTL设备
    45. """
    46. if device_way == False:
    47. if device == 0:
    48. cameraType = MV_GIGE_DEVICE | MV_USB_DEVICE | MV_UNKNOW_DEVICE | MV_1394_DEVICE | MV_CAMERALINK_DEVICE
    49. deviceList = MV_CC_DEVICE_INFO_LIST()
    50. # 枚举设备
    51. ret = MvCamera.MV_CC_EnumDevices(cameraType, deviceList)
    52. if ret != 0:
    53. raise Exception("enum devices fail! ret[0x%x]" % ret)
    54. return deviceList
    55. else:
    56. pass
    57. elif device_way == True:
    58. pass
    59. def open_camera(self, deviceList, CameraIdx, log_path):
    60. # generate a camera instance
    61. camera = MvCamera()
    62. # 选择设备并创建句柄
    63. stDeviceList = cast(deviceList.pDeviceInfo[CameraIdx], POINTER(MV_CC_DEVICE_INFO)).contents
    64. if log_path is not None:
    65. ret = self.camera.MV_CC_SetSDKLogPath(log_path)
    66. if ret != 0:
    67. raise Exception("set Log path fail! ret[0x%x]" % ret)
    68. # 创建句柄,生成日志
    69. ret = camera.MV_CC_CreateHandle(stDeviceList)
    70. if ret != 0:
    71. raise Exception("create handle fail! ret[0x%x]" % ret)
    72. else:
    73. # 创建句柄,不生成日志
    74. ret = camera.MV_CC_CreateHandleWithoutLog(stDeviceList)
    75. if ret != 0:
    76. raise Exception("create handle fail! ret[0x%x]" % ret)
    77. # 打开相机
    78. ret = camera.MV_CC_OpenDevice(MV_ACCESS_Exclusive, 0)
    79. if ret != 0:
    80. raise Exception("open device fail! ret[0x%x]" % ret)
    81. return camera
    82. def start_camera(self):
    83. stParam = MVCC_INTVALUE()
    84. memset(byref(stParam), 0, sizeof(MVCC_INTVALUE))
    85. ret = self.camera.MV_CC_GetIntValue("PayloadSize", stParam)
    86. if ret != 0:
    87. raise Exception("get payload size fail! ret[0x%x]" % ret)
    88. self.nDataSize = stParam.nCurValue
    89. self.pData = (c_ubyte * self.nDataSize)()
    90. self.stFrameInfo = MV_FRAME_OUT_INFO_EX()
    91. memset(byref(self.stFrameInfo), 0, sizeof(self.stFrameInfo))
    92. self.camera.MV_CC_StartGrabbing()
    93. def get_Value(self, param_type, node_name):
    94. """
    95. :param cam: 相机实例
    96. :param_type: 获取节点值得类型
    97. :param node_name: 节点名 可选 int 、float 、enum 、bool 、string 型节点
    98. :return: 节点值
    99. """
    100. if param_type == "int_value":
    101. stParam = MVCC_INTVALUE_EX()
    102. memset(byref(stParam), 0, sizeof(MVCC_INTVALUE_EX))
    103. ret = self.camera.MV_CC_GetIntValueEx(node_name, stParam)
    104. if ret != 0:
    105. raise Exception("获取 int 型数据 %s 失败 ! 报错码 ret[0x%x]" % (node_name, ret))
    106. return stParam.nCurValue
    107. elif param_type == "float_value":
    108. stFloatValue = MVCC_FLOATVALUE()
    109. memset(byref(stFloatValue), 0, sizeof(MVCC_FLOATVALUE))
    110. ret = self.camera.MV_CC_GetFloatValue(node_name, stFloatValue)
    111. if ret != 0:
    112. raise Exception("获取 float 型数据 %s 失败 ! 报错码 ret[0x%x]" % (node_name, ret))
    113. return stFloatValue.fCurValue
    114. elif param_type == "enum_value":
    115. stEnumValue = MVCC_ENUMVALUE()
    116. memset(byref(stEnumValue), 0, sizeof(MVCC_ENUMVALUE))
    117. ret = self.camera.MV_CC_GetEnumValue(node_name, stEnumValue)
    118. if ret != 0:
    119. raise Exception("获取 enum 型数据 %s 失败 ! 报错码 ret[0x%x]" % (node_name, ret))
    120. return stEnumValue.nCurValue
    121. elif param_type == "bool_value":
    122. stBool = c_bool(False)
    123. ret = self.camera.MV_CC_GetBoolValue(node_name, stBool)
    124. if ret != 0:
    125. raise Exception("获取 bool 型数据 %s 失败 ! 报错码 ret[0x%x]" % (node_name, ret))
    126. return stBool.value
    127. elif param_type == "string_value":
    128. stStringValue = MVCC_STRINGVALUE()
    129. memset(byref(stStringValue), 0, sizeof(MVCC_STRINGVALUE))
    130. ret = self.camera.MV_CC_GetStringValue(node_name, stStringValue)
    131. if ret != 0:
    132. raise Exception("获取 string 型数据 %s 失败 ! 报错码 ret[0x%x]" % (node_name, ret))
    133. return stStringValue.chCurValue
    134. else:
    135. return None
    136. def set_Value(self, param_type, node_name, node_value):
    137. """
    138. :param cam: 相机实例
    139. :param param_type: 需要设置的节点值得类型
    140. int:
    141. float:
    142. enum: 参考于客户端中该选项的 Enum Entry Value 值即可
    143. bool: 对应 0 为关,1 为开
    144. string: 输入值为数字或者英文字符,不能为汉字
    145. :param node_name: 需要设置的节点名
    146. :param node_value: 设置给节点的值
    147. :return:
    148. """
    149. if param_type == "int_value":
    150. ret = self.camera.MV_CC_SetIntValueEx(node_name, int(node_value))
    151. if ret != 0:
    152. raise Exception("设置 int 型数据节点 %s 失败 ! 报错码 ret[0x%x]" % (node_name, ret))
    153. elif param_type == "float_value":
    154. ret = self.camera.MV_CC_SetFloatValue(node_name, float(node_value))
    155. if ret != 0:
    156. raise Exception("设置 float 型数据节点 %s 失败 ! 报错码 ret[0x%x]" % (node_name, ret))
    157. elif param_type == "enum_value":
    158. ret = self.camera.MV_CC_SetEnumValueByString(node_name, node_value)
    159. if ret != 0:
    160. raise Exception("设置 enum 型数据节点 %s 失败 ! 报错码 ret[0x%x]" % (node_name, ret))
    161. elif param_type == "bool_value":
    162. ret = self.camera.MV_CC_SetBoolValue(node_name, node_value)
    163. if ret != 0:
    164. raise Exception("设置 bool 型数据节点 %s 失败 ! 报错码 ret[0x%x]" % (node_name, ret))
    165. elif param_type == "string_value":
    166. ret = self.camera.MV_CC_SetStringValue(node_name, str(node_value))
    167. if ret != 0:
    168. raise Exception("设置 string 型数据节点 %s 失败 ! 报错码 ret[0x%x]" % (node_name, ret))
    169. def set_exposure_time(self, exp_time):
    170. self.set_Value(param_type="float_value", node_name="ExposureTime", node_value=exp_time)
    171. def get_exposure_time(self):
    172. return self.get_Value(param_type="float_value", node_name="ExposureTime")
    173. def get_image(self, width=None):
    174. """
    175. :param cam: 相机实例
    176. :active_way:主动取流方式的不同方法 分别是(getImagebuffer)(getoneframetimeout)
    177. :return:
    178. """
    179. # ret= self.camera.MV_CC_SaveImageEx2()
    180. ret = self.camera.MV_CC_GetOneFrameTimeout(self.pData, self.nDataSize, self.stFrameInfo, 5000)
    181. if ret == 0:
    182. image = np.asarray(self.pData).reshape((self.stFrameInfo.nHeight, self.stFrameInfo.nWidth, 3))
    183. # if width is not None:
    184. # image = cv2.resize(image, (width, int(self.stFrameInfo.nHeight * width / self.stFrameInfo.nWidth)))
    185. # pass
    186. image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    187. return image
    188. else:
    189. return None
    190. def show_runtime_info(self, image):
    191. exp_time = self.get_exposure_time()
    192. cv2.putText(image, ("exposure time = %1.1fms" % (exp_time * 0.001)), (20, 50), cv2.FONT_HERSHEY_SIMPLEX, 0.5,
    193. 255, 1)

    获取照片数据

    Main.py
    1. import os
    2. import cv2
    3. from numpy import ndarray
    4. from HKCamera_class import HKCamera
    5. if __name__ == '__main__':
    6. camera = HKCamera(CameraIp='192.168.1.191')
    7. # 对摄像头配置进行设置
    8. try:
    9. camera.set_Value(param_type="enum_value", node_name="PixelFormat",
    10. node_value='RGB8Packed')
    11. camera.set_Value(param_type="enum_value", node_name="ExposureAuto",
    12. node_value='Off')
    13. camera.set_Value(param_type="float_value", node_name="ExposureTime",
    14. node_value='400')
    15. except Exception as e:
    16. print(e)
    17. os._exit(0)
    18. camera.start_camera()
    19. while True:
    20. try:
    21. image: ndarray = camera.get_image()
    22. if image is not None:
    23. # 这里拿到图片的ndarray数据后,可以转Image、可以保存图片....等等操作
    24. print(image.shape)
    25. key = cv2.waitKey(50) & 0xFF
    26. if key == ord('e') or key == ord('E'):
    27. cv2.destroyAllWindows()
    28. break
    29. except Exception as e:
    30. print(e)

  • 相关阅读:
    记一次使用NetworkManager管理Ubuntu网络无效问题分析
    python分支结构的花样玩法(一)
    猿创征文|走技术创新路,展时代宏图梦
    springboot毕设项目社团活动网站b7rjo(java+VUE+Mybatis+Maven+Mysql)
    5、ByteBuffer(基础使用)
    着巨大风险!力荐这套「软件安装和环境配置手册」,看了直呼NB
    12.2 实现键盘模拟按键
    外贸网站建设怎么做?
    C++从头捡起——2. 零散的知识
    计算机组成原理——总结
  • 原文地址:https://blog.csdn.net/wenxingchen/article/details/133805272