Python调用海康工业相机:包含相机参数修改、彩色原图显示(不失真)

本文详细介绍了如何使用Python调用海康工业相机,解决USB相机连接问题,并实现相机参数如曝光时间、增益、伽马校正的调整。同时,展示了获取高保真彩色原图的方法,图像质量与官方VM软件相当。提供了源码供读者参考和交流。

【引言】

海康相机作为目前工业检测、视觉定位等领域应用较为广泛的国产品牌相机,其搭配有一套专用视觉软件VM,而在完成具有复杂场景、复杂任务的科研项目时依靠其VM算法平台提供的视觉算法往往无法满足项目要求,常涉及到基于海康Demo、SDK进行二次开发的任务。本文根据近期项目经历,特此记录采用Python调用海康相机的过程与源码分享。

【亮点】

1.解决了采用Python直接调用海康USB工业相机的问题;
2.集成了修改相机曝光时间、增益、伽马校正等参数设置功能;
3.输出高还原性、高保真的彩色原图(与MVS获取的图像成像质量几乎完全相同)。

【源码分享】

import sys
import tkinter
import tkinter.messagebox
from tkinter import *
from tkinter.messagebox import *
import tkinter as tk

import cv2
import argparse
import struct
import numpy as np
import threading
import msvcrt
from ctypes import *

# 根据自己安装的海康MVS软件路径修改即可
sys.path.append(r"E:\Program Files (x86)\MVS\Development\Samples\Python\MvImport")
from MvCameraControl_class import *


def hikvision2image(exposureTime, gain, gammaEnable, gamma):
    # 1.获得设备信息
    deviceList = MV_CC_DEVICE_INFO_LIST()
    tlayerType = MV_GIGE_DEVICE | MV_USB_DEVICE

    # 枚举设备
    # nTLayerType [IN] 枚举传输层 ,pstDevList [OUT] 设备列表
    ret = MvCamera.MV_CC_EnumDevices(tlayerType, deviceList)
    if ret != 0:
        print("enum devices fail! ret[0x%x]" % ret)
        sys.exit()

    if deviceList.nDeviceNum == 0:
        print("find no device!")
        sys.exit()

    print("Find %d devices!" % deviceList.nDeviceNum)

    # 2.输出设备信息
    for i in range(0, deviceList.nDeviceNum):
        mvcc_dev_info = cast(deviceList.pDeviceInfo[i], POINTER(MV_CC_DEVICE_INFO)).contents
        # 1)GIGE相机
        if mvcc_dev_info.nTLayerType == MV_GIGE_DEVICE:
            print("\ngige device: [%d]" % i)
            # 输出设备名字
            strModeName = ""
            for per in mvcc_dev_info.SpecialInfo.stGigEInfo.chModelName:
                strModeName = strModeName + chr(per)
            print("device model name: %s" % strModeName)
            # 输出设备ID
            nip1 = ((mvcc_dev_info.SpecialInfo.stGigEInfo.nCurrentIp & 0xff000000) >> 24)
            nip2 = ((mvcc_dev_info.SpecialInfo.stGigEInfo.nCurrentIp & 0x00ff0000) >> 
在使用 Python 调用海康工业相机并调整图像分辨率或图片尺寸时,需要确保以下几个关键步骤正确执行,以便 OpenCV 能够正常访问相机流并进行图像处理。 ### 海康工业相机驱动与适配器配置 在 Windows 系统中,使用 OpenCV 通过 `VideoCapture` 接口调用海康工业相机的前提是安装 MVS 软件包,并正确注册 DirectShow 插件。运行安装脚本 `InstallDSSvc_x64.bat` 后,MvDSS2 插件将作为适配器提供视频源接口,使得 OpenCV 可以识别该设备[^1]。 ### 设置图像分辨率 OpenCV 提供了设置摄像头属性的函数 `cap.set(propId, value)`,其中常用的属性包括: - `cv2.CAP_PROP_FRAME_WIDTH`:设置帧宽度 - `cv2.CAP_PROP_FRAME_HEIGHT`:设置帧高度 - `cv2.CAP_PROP_FPS`:设置帧率 以下是一个完整的示例代码,展示如何使用 OpenCV 设置海康工业相机的图像分辨率: ```python import cv2 # 打开默认摄像头(通常是0,若连接多个设备可尝试1、2等) cap = cv2.VideoCapture(0) # 检查摄像头是否成功打开 if not cap.isOpened(): print("无法打开摄像头") else: # 设置图像分辨率 cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1920) # 设置宽度为1920 cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080) # 设置高度为1080 cap.set(cv2.CAP_PROP_FPS, 30) # 设置帧率为30fps while True: ret, frame = cap.read() # 读取一帧图像 if not ret: break # 显示原始大小图像 cv2.imshow("Original Frame", frame) # 调整图像尺寸为640x480 resized_frame = cv2.resize(frame, (640, 480)) cv2.imshow("Resized Frame", resized_frame) # 按下 'q' 键退出循环 if cv2.waitKey(1) == ord('q'): break # 释放资源 cap.release() cv2.destroyAllWindows() ``` ### 图像尺寸调整 如果实际图像输出尺寸符合预期,或者图像格式特殊(如 YUV 格式),则可能需要先进行颜色空间转换和形状重塑。例如,在 Linux 平台下,某些型号的海康相机输出的是 YUV 格式的原始数据,需手动转换为 RGB 格式后再进行显示或保存: ```python import cv2 import numpy as np # 假设image是从相机获取的原始数据,shape为(2048, 3072, 2) image = np.random.randint(0, 256, (2048, 3072, 2), dtype=np.uint8) # 示例数据 # 转换为RGB格式 image = cv2.cvtColor(image, cv2.COLOR_YUV2RGB_Y422) # 调整图像尺寸 resized_image = cv2.resize(image, (640, 480)) # 显示图像 cv2.imshow("Resized Image", resized_image) cv2.waitKey(0) ``` 注意:上述转换方式适用于特定格式的数据流,具体应根据实际相机输出格式进行相应处理。 ### 常见问题排查 - **段错误**:可能是由于图像数据未正确解码或内存访问越界导致。建议检查图像数据的来源格式,并确保 `reshape` 参数与图像尺寸匹配。 - **图像全黑**:请确认是否已正确安装 MVS 驱动,并在 MVS 客户端中测试相机能否正常取流。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RobVisual_Servo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值