Baumer堡盟工业相机BGAPI SDK联合OpenCV进行Bayer图像转换(C++)

简介: Baumer堡盟工业相机BGAPI SDK联合OpenCV进行Bayer图像转换(C++)

(C++)本文介绍Baumer堡盟工业相机BGAPI SDK联合OpenCV进行Bayer图像转换


Bayer像素格式

48f3da8aeea3486183290d139a7d9669.png


Bayer像素格式广泛用于CCD和CMOS相机。采用Bayer格式,可以从一个单独的平面得到彩色图像,该平面上的R、G和B像素点(即特定分量的传感器)交错排列(如左图所示)。


对于单个像素,输出的RGB分量是由该像素周围具有相同颜色的1个、2个或4个相邻像素进行插值得到的。Bayer阵列可以通过向左和/或向上平移一个像素来进行修改。转换常数CV_Bayer C1C2 2BGR和CV_Bayer C1C2 2RGB中的C1和C2两个字母代表特定的阵列类型,分别是第二行、第二列和第三列的颜色分量。例如,阵列中有一个很常用的“BG”类型。


使用cvtColor的OpenCV颜色转换

彩色相机支持BayerBG8、BayerGB8、BayerGR8和BayerRG8等原始像素格式。

如需进一步进行图像处理,必须将这些格式转换为BGR8格式。

堡盟相机根据图像第一行的前两个像素给Bayer阵列命名。而OpenCV则根据图像第二行的第二和第三个像素给阵列命名,因此命名方式有所不同,对应关系如下:


堡盟相机的BayerGB对应OpenCV的BayerGR

堡盟相机的BayerRG对应OpenCV的BayerBG

堡盟相机的BayerGR对应OpenCV的BayerGB

堡盟相机的BayerBG对应OpenCV的BayerRG


pDevice->GetRemoteNode("PixelFormat")->SetString("BayerRG8");
BGAPI2::Buffer * pBufferFilled = pDataStream->GetFilledBuffer(1000);
if (pBufferFilled->GetPixelFormat() == "BayerRG8")
{
  cv::Mat* imOriginal = new cv::Mat((int)pBufferFilled->GetHeight(),
                                   (int)pBufferFilled->GetWidth(),
                                   CV_8UC1,
                                   (char *)pBufferFilled->GetMemPtr();
  cv::Mat* imTransformBGR8 = new cv::Mat((int)pBufferFilled->GetHeight(),
                                       (int)pBufferFilled->GetWidth(),
                                       CV_8UC3);
  //Baumer: RGrgrg  >>  OpenCV: rgrgrg
  //        gbgbgb              gBGbgb
  cv::cvtColor(*imOriginal, *imTransformBGR8, CV_BayerBG2BGR); //to BGR
  delete imOriginal;
  pBufferFilled->QueueBuffer();
  cv::imwrite("cv_BayerRG8_as_BGR8_image.png", *imTransformBGR8);
  delete imTransformBGR8;
}

将Bayer格式转换为BGR16

BayerBG12、BayerGB12、BayerGR12和BayerRG12等其他原始像素格式在Bayer图像中使用更多位数。首先需要将这些原始数据从12位转换为16位。之后,可以通过cvtColor将16位Bayer格式转换为48位BGR16格式(每个颜色通道为16位)。

对于BayerBG10、BayerGB10、BayerGR10或BayerRG10等10位Bayer格式,在将其转换为16位Bayer格式时,比例因子应选取64.0而非16.0。

pDevice->GetRemoteNode("PixelFormat")->SetString("BayerGB12");
BGAPI2::Buffer * pBufferFilled = pDataStream->GetFilledBuffer(1000);
if (pBufferFilled->GetPixelFormat() == "BayerGB12")
{
  cv::Mat* imOriginal = new cv::Mat((int)pBufferFilled->GetHeight(),
                                   (int)pBufferFilled->GetWidth(),
                                   CV_16UC1,
                                   (char *)pBufferFilled->GetMemPtr();
  cv::Mat* imConvert = new cv::Mat((int)pBufferFilled->GetHeight(), 
                                  (int)pBufferFilled->GetWidth(), 
                                  CV_16UC1);
  //convert with scaling of 16.0 to convert 12-Bit to 16-Bit 
  imOriginal->convertTo(*imConvert, CV_16UC1, 16.0);
  delete imOriginal;
  pBufferFilled->QueueBuffer();
  cv::Mat* imTransformBGR16 = new cv::Mat((int)pBufferFilled->GetHeight(), 
                                         (int)pBufferFilled->GetWidth(), 
                                         CV_16UC3);
  //Baumer: GBgbgb  >>  OpenCV: gbgbgb
  //        rgrgrg              rGRgrg
  cv::cvtColor(*imConvert, *imTransformBGR16, CV_BayerGR2BGR); //to BGR
  delete imConvert;
  cv::imwrite("cv_BayerGB12_as_BGR16_image.png", *imTransformBGR16);
  delete imTransformBGR16;
}
目录
相关文章
|
21天前
|
计算机视觉 索引
OpenCV4学习笔记(2):显示相机视频流的帧率
这篇文章是OpenCV4学习笔记的第二部分,介绍了如何通过OpenCV4在显示相机视频流时计算并显示其帧率,使用`getTickCount`和`getTickFrequency`函数来测量帧时间,并用`putText`在图像上绘制帧率信息。
OpenCV4学习笔记(2):显示相机视频流的帧率
|
10天前
|
算法 计算机视觉
opencv图像形态学
图像形态学是一种基于数学形态学的图像处理技术,它主要用于分析和修改图像的形状和结构。
26 4
|
20天前
|
算法 计算机视觉 Python
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
该文章详细介绍了使用Python和OpenCV进行相机标定以获取畸变参数,并提供了修正图像畸变的全部代码,包括生成棋盘图、拍摄标定图像、标定过程和畸变矫正等步骤。
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
WK
|
18天前
|
编解码 计算机视觉 Python
如何在OpenCV中进行图像转换
在OpenCV中,图像转换涉及颜色空间变换、大小调整及类型转换等操作。常用函数如`cvtColor`可实现BGR到RGB、灰度图或HSV的转换;`resize`则用于调整图像分辨率。此外,通过`astype`或`convertScaleAbs`可改变图像数据类型。对于复杂的几何变换,如仿射或透视变换,则可利用`warpAffine`和`warpPerspective`函数实现。这些技术为图像处理提供了强大的工具。
WK
47 1
|
20天前
|
算法 定位技术 vr&ar
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
90 0
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
|
1月前
|
机器人 计算机视觉
巧用 OpenCV solvePnP() 函数完成由图像坐标系到机器人坐标系的转换(二维坐标系之间的转换)
巧用 OpenCV solvePnP() 函数完成由图像坐标系到机器人坐标系的转换(二维坐标系之间的转换)
36 2
|
3月前
|
算法 计算机视觉
【Qt&OpenCV 图像的感兴趣区域ROI】
【Qt&OpenCV 图像的感兴趣区域ROI】
84 1
|
2月前
|
机器学习/深度学习 XML 计算机视觉
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。
|
20天前
|
JavaScript 前端开发 Java
[Android][Framework]系统jar包,sdk的制作及引用
[Android][Framework]系统jar包,sdk的制作及引用
36 0
|
1月前
|
开发工具 Android开发
解决Android运行出现NDK at /Library/Android/sdk/ndk-bundle did not have a source.properties file
解决Android运行出现NDK at /Library/Android/sdk/ndk-bundle did not have a source.properties file
134 4
解决Android运行出现NDK at /Library/Android/sdk/ndk-bundle did not have a source.properties file