Python-OpenCV打开海康机器人黑白相机

将MvImport内所有文件拷贝至工作目录

项目结构

复制代码
requirements.txt
python 复制代码
# 基础科学计算库
numpy>=1.24.0

# 计算机视觉
opencv-python>=4.8.0
复制代码
hk_opencv.py
python 复制代码
import cv2
import numpy as np
from MvCameraControl_class import *
from CameraParams_header import *

# CameraNumber = 1为黑白相机,CameraNumber = 3为彩色相机
CameraNumber = 1

#-------------------opencv操作部分--------------------------------------
def opencv_action(img):
    result_img = img
    return result_img

#-----------------------海康相机设置部分---------------------------------------

ret = MvCamera.MV_CC_Initialize()
if ret != 0:
    print(f"初始化SDK失败,错误码: {ret}")
    exit()

# 枚举设备
deviceList = MV_CC_DEVICE_INFO_LIST()
n_layer_type = MV_GIGE_DEVICE | MV_USB_DEVICE | MV_GENTL_CAMERALINK_DEVICE
ret = MvCamera.MV_CC_EnumDevices(n_layer_type, deviceList)
if ret != 0:
    print("枚举设备失败")
    exit()

print(f"找到 {deviceList.nDeviceNum} 台设备")
if deviceList.nDeviceNum == 0:
    exit()

stDeviceList = cast(deviceList.pDeviceInfo[0], POINTER(MV_CC_DEVICE_INFO)).contents

camera = MvCamera()

ret = camera.MV_CC_CreateHandle(stDeviceList)

# 打开设备(使用已创建的句柄)
ret = camera.MV_CC_OpenDevice()
if ret != 0:
    print(f"打开设备失败,错误码: {ret}")
    exit()

# 获取相机参数
width = c_uint()
height = c_uint()
pixel_format = c_uint()
payload_size = c_uint()
stParam = MVCC_INTVALUE()

ret = camera.MV_CC_GetIntValue("PayloadSize", stParam)
if ret != 0:
    print(f"获取PayloadSize失败,错误码: {ret}")
    exit()
payload_size.value = stParam.nCurValue

# 获取宽度
ret = camera.MV_CC_GetIntValue("Width", stParam)
if ret != 0:
    print(f"获取宽度失败,错误码: {ret}")
    exit()
width.value = stParam.nCurValue

# 获取高度
ret = camera.MV_CC_GetIntValue("Height", stParam)
if ret != 0:
    print(f"获取高度失败,错误码: {ret}")
    exit()
height.value = stParam.nCurValue

print(width.value,height.value)


pixel_format.value = 17301505  # RGB8
# 或
#pixel_format.value = 17301514  # Mono8

#曝光时间
exposure_time = 15000  # 单位:微秒
ret = camera.MV_CC_SetFloatValue("ExposureTime", exposure_time)

# 开始抓图
ret = camera.MV_CC_StartGrabbing()
if ret != 0:
    print(f"开始抓图失败,错误码: {ret}")
    exit()

# 分配缓冲区
data_buf = (c_ubyte * payload_size.value)()
data_size = c_uint(payload_size.value)

stFrameInfo = MV_FRAME_OUT_INFO_EX()

#-----------------------------------------------运行部分---------------------------

# 创建OpenCV窗口
cv2.namedWindow("Camera", cv2.WINDOW_NORMAL)

try:
    while True:
        data_buf = (c_ubyte * payload_size.value)()
        ret = camera.MV_CC_GetOneFrameTimeout(
            byref(data_buf),
            payload_size.value,
            stFrameInfo,
            1000
        )

        if ret == 0:
            #print(f"获取到帧: 宽度={stFrameInfo.nWidth}, 高度={stFrameInfo.nHeight}, "f"像素格式={stFrameInfo.enPixelType}, 帧大小={stFrameInfo.nFrameLen}")

            frame = np.frombuffer(data_buf, dtype=np.uint8)
            actual_width = stFrameInfo.nWidth
            actual_height = stFrameInfo.nHeight
            # 黑白相机
            if stFrameInfo.enPixelType == 17301505:  # RGB8
                expected_size = actual_width * actual_height * CameraNumber
                if len(frame) != expected_size:
                    print(f"数据大小不匹配: 期望 {expected_size}, 实际 {len(frame)}")
                    continue

                frame = frame.reshape((actual_height, actual_width, CameraNumber))
                frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
            elif stFrameInfo.enPixelType == 17301514:  # Mono8
                expected_size = actual_width * actual_height
                if len(frame) != expected_size:
                    print(f"数据大小不匹配: 期望 {expected_size}, 实际 {len(frame)}")
                    continue

                frame = frame.reshape((actual_height, actual_width))
            elif stFrameInfo.enPixelType == 17301513:  # 可能是 Bayer 格式
                expected_size = actual_width * actual_height
                if len(frame) != expected_size:
                    print(f"数据大小不匹配: 期望 {expected_size}, 实际 {len(frame)}")
                    continue

                frame = frame.reshape((actual_height, actual_width))
                frame = cv2.cvtColor(frame, cv2.COLOR_BayerGB2BGR)

                frame = opencv_action(frame)
            else:
                print(f"不支持的像素格式: {stFrameInfo.enPixelType}")
                break

            cv2.imshow("Camera", frame)

            if cv2.waitKey(1) & 0xFF == ord("q"):
                break

        else:
            print(f"获取图像失败,错误码: {ret}")
            break

finally:
    # 停止抓图
    camera.MV_CC_StopGrabbing()
    # 关闭设备
    camera.MV_CC_CloseDevice()
    # 销毁句柄
    camera.MV_CC_DestroyHandle()
    # 销毁窗口
    cv2.destroyAllWindows()

最终效果:

相关推荐
曦月逸霜6 小时前
啥是RAG 它能干什么?
人工智能·python·机器学习
2301_769340677 小时前
如何在 Vuetify 中可靠捕获 Chip 关闭事件(包括键盘触发).txt
jvm·数据库·python
欲儿8 小时前
magicCamera—魔术师的 AR 卡牌应用
opencv·安卓·魔术师
南 阳8 小时前
Python从入门到精通day66
开发语言·python
m0_596749099 小时前
JavaScript中手动实现一个new操作符的底层逻辑
jvm·数据库·python
DTAS尺寸公差分析软件9 小时前
DTAS3D v13.0 三维尺寸公差分析软件可申请试用
python·尺寸公差分析·三维公差分析·公差仿真软件·尺寸链计算
DTAS尺寸公差分析软件9 小时前
DTAS 3D公差分析软件最新版本介绍
python·3d·尺寸公差分析·尺寸链计算·尺寸工程·尺寸链校核软件·公差仿真分析
PieroPc9 小时前
CAMWATCH — 局域网摄像头监控系统 Fastapi + html
前端·python·html·fastapi·监控
feasibility.9 小时前
反爬十层妖塔:现代爬虫攻防的立体战争
爬虫·python·科技·scrapy·rust·go·硬件
十八旬9 小时前
快速安装ClaudeCode完整指南
开发语言·windows·python·claude