海康工业相机常用参数修改以及使用OpenCV-Python采集图像

最近需要工业摄像头给之前的python项目做采集任务,于是选了海康的工业相机,对于单纯做采集任务而不想深究的人来说看繁杂的开发文档很麻烦,所以把这两天的工作总结一下,希望能对后面用海康相机的新手有帮助。

一、调节相机参数

用海康的MVS就可以调节参数。

1.调节曝光时间

接好相机打开MVS,在右边常用属性里就可以修改曝光时间。我用的这款MV-CE060-10UC相机默认参数下的亮度很低,需要很长的曝光时间,但要注意曝光时间太长会影响帧率。

2.修改图像尺寸和像素格式

在图像处理里就可以改变采集图像的尺寸,如果是彩色摄像头默认的像素格式是Bayer RG8要改为RGB8否则用本例程采集的图像就是灰度图像。

在这里插入图片描述
在这里插入图片描述
修改像素格式后会有一定的颜色失真,可以去常用属性里打开自动增益和伽马矫正。

3.保存参数

改完参数之后可以打开用户集控制保存参数。

保存配置并启用相同的配置。

二、Python采集成opencv可识别格式,并用opencv显示

要先把官方提供的MvImport文件夹复制到自己的工程文件夹下,彩色相机要修改像素格式不然就会显示灰度图像,

# -- coding: utf-8 --
import sys
import numpy as np
import cv2
sys.path.append(r".\MvImport")
from MvCameraControl_class import *
def Enum_device(tlayerType, deviceList):
    ch:枚举设备 | en:Enum 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)
    for i in range(0, deviceList.nDeviceNum):
        mvcc_dev_info = cast(deviceList.pDeviceInfo[i], POINTER(MV_CC_DEVICE_INFO)).contents
        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) >> 16)
            nip3 = ((mvcc_dev_info.SpecialInfo.stGigEInfo.nCurrentIp & 0x0000ff00) >> 8)
            nip4 = (mvcc_dev_info.SpecialInfo.stGigEInfo.nCurrentIp & 0x000000ff)
            print("current ip: %d.%d.%d.%d\n" % (nip1, nip2, nip3, nip4))
        # 输出USB接口的信息
        elif mvcc_dev_info.nTLayerType == MV_USB_DEVICE:
            print("\nu3v device: [%d]" % i)
            strModeName = ""
            for per in mvcc_dev_info.SpecialInfo.stUsb3VInfo.chModelName:
                if per == 0:
                    break
                strModeName = strModeName + chr(per)
            print("device model name: %s" % strModeName)
            strSerialNumber = ""
            for per in mvcc_dev_info.SpecialInfo.stUsb3VInfo.chSerialNumber:
                if per == 0:
                    break
                strSerialNumber = strSerialNumber + chr(per)
            print("user serial number: %s" % strSerialNumber)
def enable_device(nConnectionNum):
    :param nConnectionNum: 设备编号
    :return: 相机, 图像缓存区, 图像数据大小
    # ch:创建相机实例 | en:Creat Camera Object
    cam = MvCamera()
    # ch:选择设备并创建句柄 | en:Select device and create handle
    # cast(typ, val),这个函数是为了检查val变量是typ类型的,但是这个cast函数不做检查,直接返回val
    stDeviceList = cast(deviceList.pDeviceInfo[int(nConnectionNum)], POINTER(MV_CC_DEVICE_INFO)).contents
    ret = cam.MV_CC_CreateHandle(stDeviceList)
    if ret != 0:
        print("create handle fail! ret[0x%x]" % ret)
        sys.exit()
    # ch:打开设备 | en:Open device
    ret = cam.MV_CC_OpenDevice(MV_ACCESS_Exclusive, 0)
    if ret != 0:
        print("open device fail! ret[0x%x]" % ret)
        sys.exit()
    # ch:探测网络最佳包大小(只对GigE相机有效) | en:Detection network optimal package size(It only works for the GigE camera)
    if stDeviceList.nTLayerType == MV_GIGE_DEVICE:
        nPacketSize = cam.MV_CC_GetOptimalPacketSize()
        if int(nPacketSize) > 0:
            ret = cam.MV_CC_SetIntValue("GevSCPSPacketSize", nPacketSize)
            if ret != 0:
                print("Warning: Set Packet Size fail! ret[0x%x]" % ret)
        else:
            print("Warning: Get Packet Size fail! ret[0x%x]" % nPacketSize)
    # ch:设置触发模式为off | en:Set trigger mode as off
    ret = cam.MV_CC_SetEnumValue("TriggerMode", MV_TRIGGER_MODE_OFF)
    if ret != 0:
        print("set trigger mode fail! ret[0x%x]" % ret)
        sys.exit()
    # 从这开始,获取图片数据
    # ch:获取数据包大小 | en:Get payload size
    stParam = MVCC_INTVALUE()
    memset(byref(stParam), 0, sizeof(MVCC_INTVALUE))
    # MV_CC_GetIntValue,获取Integer属性值,handle [IN] 设备句柄
    # strKey [IN] 属性键值,如获取宽度信息则为"Width"
    # pIntValue [IN][OUT] 返回给调用者有关相机属性结构体指针
    # 得到图片尺寸,这一句很关键
    # payloadsize,为流通道上的每个图像传输的最大字节数,相机的PayloadSize的典型值是(宽x高x像素大小),此时图像没有附加任何额外信息
    ret = cam.MV_CC_GetIntValue("PayloadSize", stParam)
    if ret != 0:
        print("get payload size fail! ret[0x%x]" % ret)
        sys.exit()
    nPayloadSize = stParam.nCurValue
    # ch:开始取流 | en:Start grab image
    ret = cam.MV_CC_StartGrabbing()
    if ret != 0:
        print("start grabbing fail! ret[0x%x]" % ret)
        sys.exit()
    #  返回获取图像缓存区。
    data_buf = (c_ubyte * nPayloadSize)()
    #  date_buf前面的转化不用,不然报错,因为转了是浮点型
    return cam, data_buf, nPayloadSize
def get_image(data_buf, nPayloadSize):
    :param data_buf:
    :param nPayloadSize:
    :return: 图像
    # 输出帧的信息
    stFrameInfo = MV_FRAME_OUT_INFO_EX()
    # void *memset(void *s, int ch, size_t n);
    # 函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s
    # memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法
    # byref(n)返回的相当于C的指针右值&n,本身没有被分配空间
    # 此处相当于将帧信息全部清空了
    memset(byref(stFrameInfo), 0, sizeof(stFrameInfo))
    # 采用超时机制获取一帧图片,SDK内部等待直到有数据时返回,成功返回0
    ret = cam.MV_CC_GetOneFrameTimeout(data_buf, nPayloadSize, stFrameInfo, 1000)
    if ret == 0:
        print("get one frame: Width[%d], Height[%d], nFrameNum[%d]" % (
            stFrameInfo.nWidth, stFrameInfo.nHeight, stFrameInfo.nFrameNum))
    else:
        print("no data[0x%x]" % ret)
    image = np.asarray(data_buf)  # 将c_ubyte_Array转化成ndarray得到(3686400,)
    image = image.reshape((stFrameInfo.nHeight, stFrameInfo.nWidth, -1))  # 根据自己分辨率进行转化
    return image
def close_device(cam, data_buf):
    :param cam:
    :param data_buf:
    # ch:停止取流 | en:Stop grab image
    ret = cam.MV_CC_StopGrabbing()
    if ret != 0:
        print("stop grabbing fail! ret[0x%x]" % ret)
        del data_buf
        sys.exit()
    # ch:关闭设备 | Close device
    ret = cam.MV_CC_CloseDevice()
    if ret != 0:
        print("close deivce fail! ret[0x%x]" % ret)
        del data_buf
        sys.exit()
    # ch:销毁句柄 | Destroy handle
    ret = cam.MV_CC_DestroyHandle()
    if ret != 0:
        print("destroy handle fail! ret[0x%x]" % ret)
        del data_buf
        sys.exit()
    del data_buf
if __name__ == "__main__":
    # 获得设备信息
    deviceList = MV_CC_DEVICE_INFO_LIST()
    tlayerType = MV_GIGE_DEVICE | MV_USB_DEVICE
    # ch: 枚举设备 | en:Enum device
    # nTLayerType[IN] 枚举传输层 ,pstDevList[OUT] 设备列表
    Enum_device(tlayerType, deviceList)
    # 获取相机和图像数据缓存区
    cam, data_buf, nPayloadSize = enable_device(0)  # 选择第一个设备
    while True:
        image = get_image(data_buf, nPayloadSize)
        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)  # 默认是BRG,要转化成RGB,颜色才正常
        cv2.namedWindow("image", cv2.WINDOW_NORMAL)
        cv2.imshow("image", image)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            cv2.destroyAllWindows()
            break
    # 关闭设备
    close_device(cam, data_buf)
参考文章:  

链接: 利用python加opencv与海康工业相机交互。(得到供opencv处理的数据).

海康工业相机常用参数修改以及使用OpenCV-Python采集图像一、调节相机参数1.调节曝光时间2.修改图像尺寸和像素格式3.保存参数二、Python采集成opencv可识别格式,并用opencv显示最近需要工业摄像头给之前的python项目做采集任务,于是选了海康的工业相机,对于单纯做采集任务而不想深究的人来说看繁杂的开发文档很麻烦,所以把这两天的工作总结一下,希望能对后面用海康相机的新手有帮助。一、调节相机参数用海康的MVS就可以调节参数。1.调节曝光时间接好相机打开MVS,在右边常用属
查看相机SDK,查看通用配置接口MV_CC_Set/Get(数据类型)Value,每一个参数设置对应一个数据类型,可以在XML节点参数类型列表查看。1、曝光时间设置 可以看到曝光时间是一个Float数据类型 ,GetNode:key参数是ExposureTime,查看海康相机的官方软件MVS已获得当前相机曝光时间范围。连接上相机后,点击常用属性,在曝光时间设置停留鼠标,就可以显示出范围。 因此,曝光时间a的范围是27-25000000us,代码为: 2、白平衡设置
通过python调用海康威视工业摄像头并进行图像存储问题(数据流获取问题未能解决) 先说情况,本人是做视觉检测的需要高倍率摄像头进行实时检测,也就是需要深度学习进行图片数据处理,但是这个又是python来进行分析,而海康威视主要程序代码是以C为主的,传过来的数据我也尝试的去解析都是不能转化成python的BGR图像。 具体参照了:通过cv2调用海康威视摄像头,但这个不能调用工业摄像头,通过官方给一个400什么软件要激活摄像头,可是却并不能检测到工业摄像头,通过mvs软件调用到摄像头地址进行测试也无法获取到摄
海康机器人工业相机常用参数功能设置与获取(C语言)前言DeviceControlImageFormatControlAcquisitionControlDigitalIOControlActionControlFileAccessControlEventControlChunkDataControlTransportLayerControlUserSetControl DeviceControl ImageFormatControl AcquisitionControl DigitalIOContro
目前缺芯的大环境也影响到工业相机上面了,使用支持国产海康机器人的工业相机进行视觉开发是不错的替代方案。价格交期很是感人呐! 参考文章python调用海康工业相机并用opencv显示(整体实现) 博主写的很全面非常好。 PyQt显示相机图像本文推荐另一种方法“将numpy array 先转化为 Pillow image 再转化为Pixmap” 并用来显示。 主要步骤: (1)HikRobot 官网下载安装“机器视觉工业相机客户端MVS V3.3.1(Windows)”, 下载链接。 (2)安装后参考官网自.
可以使用 OpenCV 中的函数 cv2.rectangle() 来绘制矩形框,然后使用 numpy 数组切片来提取 ROI。具体实现可以参考以下代码: ```python import cv2 # 读取图像 img = cv2.imread('image.jpg') # 绘制矩形框 x, y, w, h = 100, 100, 200, 200 cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2) # 提取 ROI roi = img[y:y+h, x:x+w] # 显示结果 cv2.imshow('image', img) cv2.imshow('roi', roi) cv2.waitKey(0) cv2.destroyAllWindows()