接上篇海康威视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

最低0.47元/天 解锁文章
3925

被折叠的 条评论
为什么被折叠?



