海康威视GidE工业相机的Bayer格式图像数据处理

接上篇海康威视GigE工业相机的python调用demo-优快云博客

  • Bayer格式数据

        取到了图像数据后,就需要对数据进行处理。我手里的这台CU系列面阵相机,在MVS中可以看到它的数据默认格式是Bayer RG8:

        Bayer RG8图像格式,采用 RGGB 布局。在这种布局中,红色(R)、绿色(G)和蓝色(B)像素点交错排列。具体来说,奇数扫描行按 R、G、R、G…… 顺序排列,偶数扫描行按 G、B、G、B…… 顺序排列,每个像素仅需一个颜色通道的数据,数据量仅为 RGB8 格式的三分之一。从图像缓存中获取到了数据后,需要进行一些处理才能转换成常规的RGB三通道数据。

  • 使用opencv转换Bayer RG8到RGB格式

        使用opencv转换Bayer RG8到RGB格式并保存文件的demo:

image_data = np.frombuffer(self.buf_save_image, dtype=np.uint8).reshape((height, width))
rgb_image = cv2.cvtColor(image_data, cv2.COLOR_BAYER_RG2RGB)
cv2.imwrite(file_path, rgb_image)

        实测3072*2048的图像数据,i510代CPU,转换时间为7ms,还算是比较迅速的。

  • 使用海康威视厂家提供的SDK转换Bayer RG8到RGB格式

厂家的ConvertPixelType.py提供了转换Bayer RG8到RGB格式的代码,核心部分:

stOutFrame = MV_FRAME_OUT()    # 创建输出帧
    memset(byref(stOutFrame), 0, sizeof(stOutFrame))   # 开辟内存区

    ret = cam.MV_CC_GetImageBuffer(stOutFrame, 1000)   # 获取帧数据
    if None != stOutFrame.pBufAddr and 0 == ret :
        print ("get one frame: Width[%d], Height[%d], nFrameNum[%d]"  % (stOutFrame.stFrameInfo.nWidth, stOutFrame.stFrameInfo.nHeight, stOutFrame.stFrameInfo.nFrameNum))

        nRGBSize = stOutFrame.stFrameInfo.nWidth * stOutFrame.stFrameInfo.nHeight * 3   # 转换后的rgb数据长度
        stConvertParam = MV_CC_PIXEL_CONVERT_PARAM_EX()    # 创建转换参数集
        memset(byref(stConvertParam), 0, sizeof(stConvertParam))    # 开辟内存区
        stConvertParam.nWidth = stOutFrame.stFrameInfo.nWidth    # 宽
        stConvertParam.nHeight = stOutFrame.stFrameInfo.nHeight   # 高
        stConvertParam.pSrcData = stOutFrame.pBufAddr   # 源数据指针
        stConvertParam.nSrcDataLen = stOutFrame.stFrameInfo.nFrameLen   # 源数据长度
        stConvertParam.enSrcPixelType = stOutFrame.stFrameInfo.enPixelType     # 源数据像素格式
        stConvertParam.enDstPixelType = PixelType_Gvsp_RGB8_Packed   # 目标数据像素格式
        stConvertParam.pDstBuffer = (c_ubyte * nRGBSize)()   # 目标数据指针
        stConvertParam.nDstBufferSize = nRGBSize   # 目标数据长度

        ret = cam.MV_CC_ConvertPixelTypeEx(stConvertParam)   # 转换数据

实测,同样配置下,厂家自带的SDK,转换时间为13ms左右,比OpenCV慢了不少。

所以,从代码简洁和运行效率两方面,opencv是优解。

  • 结合上一篇,创建适合自己使用的相机模型:

# -*- coding: utf-8 -*-
import inspect
import time

import cv2
import numpy as np

from MvCameraControl_class import *
import threading
import msvcrt
from ctypes import *



# 海康威视直连IPGigE相机
class HiKGidECamera(MvCamera):
    def __init__(self, deviceIp, netIp):
        super().__init__()
        self.buffRGB8 = None  # RGB8格式的图像缓存数据
        self.save_file_path = ""
        self.hThreadHandle = None  # 用于取流和存图的线程句柄
        self.ui_winHandle = 0  # ui显示窗口的句柄,0表示不显示。etc:ui.widgetDisplay.winId()
        self.save_pre_path = ""  # 保存图像的前置路径
        self.save_jpg_quality = 80   # 保存的jpg图像质量
        self.stSaveParam = MV_SAVE_IMAGE_TO_FILE_PARAM_EX()  # 保存图像文件的参数集
        self.stDisplayParam = MV_DISPLAY_FRAME_INFO()   # 显示图像的参数集
        self.stConvertParam = MV_CC_PIXEL_CONVERT_PARAM()  # 转换图像像素格式的参数集
        self.buf_image = None  # 用以保存和处理的图像buffer
        self.save_type = "bmp"  # 保存图像的类型
        self.model_name = ""
        self.user_defined_name = ""
        self.netIpList = []
        self.deviceIpList = []
        self.stDevInfo = MV_CC_DEVICE_INFO()  # 设备信息
        self.stGigEDev = MV_GIGE_DEVICE_INFO()  # 设备信息
        self.deviceIp = deviceIp  # 相机IP
        self.netIp = netIp  # 相机接入的网卡IP
        self.isOpened = False  # 相机是否打开
        self.isGrabbing = False  # 相机是否正在采集图像
        self.is_trigger_mode = True  # 是否触发模式
        # self.b_exit = True  # 退出取流的标志
        self.buf_lock = threading.Lock()  # 取图和存图的buffer锁

        self.b_save_bmp = False  # 是否保存bmp文件
        self.b_save_jpg = False  # 是否保存jpg文件
        self.buf_image = None  # 从缓存区中拷贝的图像buffer,用以保存和处理

    # 强制关闭线程
    def Async_raise(self, tid, exctype):
        tid = ctypes.c_long(tid)
        if not inspect.isclass(exctype):
            exctype = t
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

深蓝海拓

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

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

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

打赏作者

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

抵扣说明:

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

余额充值