海康工业网络相机 ubuntu使用opencv调用-python 不使用sdk
用户指导里面说购买的海康相机支持GigE Vision,嫌官方的sdk太复杂 就找了 一个别的方法
Harvesters:支持GenICam标准的跨平台库,可连接GigE Vision设备并获取图像流。
/opt/MVS/lib/64/MvProducerGEV.cti是安装MVS的路径上的文件
Matrix Vision的SDK根据相机接口类型提供了不同的GenTL驱动文件:
MvProducerGEV.cti
:用于GigE Vision相机(千兆网口工业相机)。MvProducerU3V.cti
:用于USB3 Vision相机(USB3接口工业相机)。mvGenTLProducer.cti
是旧版本名称,新版本已改为上述命名方式。
from harvesters.core import Harvester
import cv2
# 创建Harvester对象
h = Harvester()
# 加载GenTL驱动文件(需替换实际路径)
# h.add_file(r"C:\Program Files\MATRIX VISION\mvIMPACT Acquire\bin\x64\mvGenTLProducer.cti") # Windows示例
h.add_file("/opt/MVS/lib/64/MvProducerGEV.cti")
# 刷新设备列表
h.update() # 替代旧版的update_device_info()
# 列出所有检测到的设备
print("可用设备列表:", h.device_info_list)
# 选择第一个设备并连接
if len(h.device_info_list) > 0:
ia = h.create_image_acquirer(1) # 0表示第一个设备
ia.start_image_acquisition()
try:
while True:
# 获取图像缓冲区
with ia.fetch_buffer() as buffer:
# 转换为OpenCV格式
frame = buffer.payload.components[0].data.reshape(
buffer.height, buffer.width, -1
)
cv2.imshow("GigE Camera", frame)
if cv2.waitKey(1) == ord('q'):
break
finally:
ia.stop_image_acquisition()
ia.destroy()
h.reset()
else:
print("未检测到设备!")
方法二使用aravis调用相机
import gi
gi.require_version('Aravis', '0.6')
from gi.repository import Aravis
import cv2
import numpy as np
Aravis.update_device_list()
print(f"检测到{Aravis.get_n_devices()}台设备")
device_count = Aravis.get_n_devices() # 获取设备总数[1](@ref)
# 遍历设备信息
for i in range(device_count):
device_id = Aravis.get_device_id(i) # 设备唯一标识符
print(f"设备{i}: {device_id}")
# 初始化相机
camera = Aravis.Camera.new(Aravis.get_device_id(0))
stream = camera.create_stream(None, None)
# # 开始采集
# camera.start_acquisition()
buffer = stream.timeout_pop_buffer(2000000)
payload = camera.get_payload()
# 预分配5个缓冲区
for _ in range(5):
stream.push_buffer(Aravis.Buffer.new_allocate(payload))
camera.start_acquisition()
buffer = stream.pop_buffer()
if buffer.get_status() == Aravis.BufferStatus.SUCCESS:
# 将原始数据转换为numpy数组
image_data = buffer.get_data()
np_array = np.frombuffer(image_data, dtype=np.uint8)
# 获取图像元数据
width = buffer.get_image_width()
height = buffer.get_image_height()
# 转换为OpenCV格式(假设为BayerRG8格式)
cv_image = cv2.cvtColor(np_array.reshape(width,height), cv2.COLOR_BAYER_GR2BGR)
cv2.imwrite("color_image.png", cv_image)
print("已生成彩色预览图color_image.png")
# 释放资源
# stream.push_buffer(buffer)
camera.stop_acquisition()