ubuntu使用python调用海康工业相机
时间: 2025-02-01 11:57:59 浏览: 29
安装必要组件
为了使Python能够在Ubuntu操作系统中与海康威视工业相机进行交互,需先安装一系列依赖项和工具。这包括但不限于CMake、Qt库以及其他可能由具体项目需求决定的支持软件。
对于海康威视工业相机SDK的部署,确保已下载适用于Linux平台版本的官方SDK包[^1]。接着按照官方文档说明完成基本环境配置工作,通常涉及设置环境变量以便于后续操作能够顺利找到所需的动态链接库文件位置。
配置开发环境
考虑到兼容性和稳定性因素,建议创建一个新的Conda虚拟环境来管理整个项目的依赖关系:
conda create -n hikvision python=3.9
conda activate hikvision
随后依据个人喜好选择合适的包管理器(pip或conda)来进行额外第三方模块的引入,比如用于图像处理的OpenCV等[^3]。
编写Python代码实现图像采集功能
当上述准备工作完成后,即可着手准备具体的编程逻辑部分。下面给出了一段简单的示例代码片段展示如何利用Python接口访问并控制连接至系统的单台设备执行拍照动作:
from ctypes import cdll, c_char_p, POINTER, Structure, byref
import numpy as np
import cv2
class NET_DVR_DEVICEINFO_V40(Structure):
_fields_ = [("sSerialNumber", c_char_p * 48),
("byAlarmInPortNum", c_char_p),
("byAlarmOutPortNum", c_char_p)]
def init_camera():
HCNetSDK = cdll.LoadLibrary('./libhcnetsdk.so')
user_info = NET_DVR_INIT()
device_info = NET_DVR_DEVICEINFO_V40()
result = HCNetSDK.NET_DVR_Init(user_info)
if not result:
raise Exception("Initialization failed")
camera_handle = HCNetSDK.NET_DVR_Login_V40(
"camera_ip_address".encode(),
8000,
"username".encode(),
"password".encode(),
byref(device_info))
return HCNetSDK, camera_handle
def capture_image(HCNetSDK, camera_handle):
frame_buffer_ptr = POINTER(c_ubyte)()
buffer_size = c_ulonglong(0)
ret_code = HCNetSDK.NET_DVR_GetPicture(camera_handle, None, byref(frame_buffer_ptr), byref(buffer_size))
if ret_code != 1:
print(f"Failed to get picture with error code {ret_code}")
return
img_array = np.ctypeslib.as_array((c_ubyte * buffer_size.value).from_address(addressof(frame_buffer_ptr.contents)), shape=(buffer_size.value,))
image_data = cv2.imdecode(img_array, cv2.IMREAD_COLOR)
return image_data
if __name__ == "__main__":
sdk_lib, cam_hdl = init_camera()
try:
while True:
img = capture_image(sdk_lib, cam_hdl)
if img is not None:
cv2.imshow('Camera Feed', img)
keypress = cv2.waitKey(1) & 0xFF
if keypress == ord('q'):
break
finally:
sdk_lib.NET_DVR_Cleanup()
cv2.destroyAllWindows()
这段脚本首先加载了libhcnetsdk.so
这个共享对象作为与硬件通信的基础层,定义了一个结构体用来存储来自摄像头的信息,并实现了两个主要函数分别负责初始化会话以及抓取当前帧画面。最后主循环里不断调用后者刷新窗口直到按下'Q'键退出程序运行。
相关推荐


















