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

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

Bayer像素格式

111.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

mDevice.RemoteNodeList["PixelFormat"].Value = "BayerRG8";
BGAPI2.Buffer mBufferFilled = mDataStream.GetFilledBuffer(1000);
if (mBufferFilled.PixelFormat == "BayerRG8")
{
    Emgu.CV.Mat imOriginal = new Emgu.CV.Mat((int)mBufferFilled.Height, 
                                             (int)mBufferFilled.Width, 
                                             Emgu.CV.CvEnum.DepthType.Cv8U, 1, 
                                             (IntPtr)mBufferFilled.MemPtr, 
                                             (int)mBufferFilled.Width * 1);
    Emgu.CV.Mat imTransformBGR8 = new Emgu.CV.Mat();
    //Baumer: RGrgrg  >>  OpenCV: rgrgrg
    //        gbgbgb              gBGbgb
    Emgu.CV.CvInvoke.CvtColor(imOriginal, imTransformBGR8, 
                              Emgu.CV.CvEnum.ColorConversion.BayerBg2Bgr);
    mBufferFilled.QueueBuffer();
    Emgu.CV.CvInvoke.Imwrite("cv_BGR8_image.png", 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。

mDevice.RemoteNodeList["PixelFormat"].Value = "BayerGB12";
BGAPI2.Buffer mBufferFilled = mDataStream.GetFilledBuffer(1000);
if (mBufferFilled.PixelFormat == "BayerGB12")
{
    Emgu.CV.Mat imOriginal = new Emgu.CV.Mat((int)mBufferFilled.Height, 
                                             (int)mBufferFilled.Width, 
                                             Emgu.CV.CvEnum.DepthType.Cv16U, 1, 
                                             (IntPtr)mBufferFilled.MemPtr, 
                                             (int)mBufferFilled.Width * 2);
    Emgu.CV.Mat imConvert = new Emgu.CV.Mat((int)mBufferFilled.Height, 
                                            (int)mBufferFilled.Width, 
                                            Emgu.CV.CvEnum.DepthType.Cv16U, 1);
    //convert with scaling of 16.0 to convert 12-Bit to 16-Bit 
    imOriginal.ConvertTo(imConvert, Emgu.CV.CvEnum.DepthType.Cv16U, 16.0);
    mBufferFilled.QueueBuffer();
    Emgu.CV.Mat imTransformBGR16 = new Emgu.CV.Mat();
    //Baumer: GBgbgb  >>  OpenCV: gbgbgb
    //        rgrgrg              rGRgrg
    Emgu.CV.CvInvoke.CvtColor(imConvert, imTransformBGR16, 
                              Emgu.CV.CvEnum.ColorConversion.BayerGr2Bgr);
    Emgu.CV.CvInvoke.Imwrite("cv_BayerGB12_as_BGR16_image.png", imTransformBGR16);
}```
目录
相关文章
|
监控 API 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取每张图像的微秒时间和FrameID功能(C#)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取每张图像的微秒时间和FrameID功能(C#)
451 0
|
11月前
|
机器学习/深度学习 算法 定位技术
Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现裂缝的检测识别(C#代码UI界面版)
本项目基于YOLOv8模型与C#界面,结合Baumer工业相机,实现裂缝的高效检测识别。支持图像、视频及摄像头输入,具备高精度与实时性,适用于桥梁、路面、隧道等多种工业场景。
1305 27
|
监控 API 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取每张图像的微秒时间和FrameID功能(C++)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取每张图像的微秒时间和FrameID功能(C++)
305 0
|
数据采集 开发工具 Python
海康威视工业相机SDK+Python+PyQt开发数据采集系统(支持软件触发、编码器触发)
该系统基于海康威视工业相机SDK,使用Python与PyQt开发,支持Gige与USB相机设备的搜索及双相机同时显示。系统提供软件触发与编码器触发模式,并可在数据采集过程中实时保存图像。此外,用户可以调节曝光时间和增益,并进行信息输入,这些信息将被保存至配置文件以便下次自动加载。参数调节与实时预览等功能进一步增强了系统的实用性。
2264 1
|
存储 传感器 监控
工业相机如何实现实时和本地Raw格式图像和Bitmap格式图像的保存和相互转换(C#代码,UI界面版)
工业相机如何实现实时和本地Raw格式图像和Bitmap格式图像的保存和相互转换(C#代码,UI界面版)
1154 0
|
9月前
|
XML 前端开发 C#
C#编程实践:解析HTML文档并执行元素匹配
通过上述步骤,可以在C#中有效地解析HTML文档并执行元素匹配。HtmlAgilityPack提供了一个强大而灵活的工具集,可以处理各种HTML解析任务。
401 19
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
452 3
|
10月前
|
监控 算法 C#
C#与Halcon联合编程实现鼠标控制图像缩放、拖动及ROI绘制
C#与Halcon联合编程实现鼠标控制图像缩放、拖动及ROI绘制
2222 0
|
存储 安全 编译器
学懂C#编程:属性(Property)的概念定义及使用详解
通过深入理解和使用C#的属性,可以编写更清晰、简洁和高效的代码,为开发高质量的应用程序奠定基础。
1508 12
|
设计模式 C# 图形学
Unity 游戏引擎 C# 编程:一分钟浅谈
本文介绍了在 Unity 游戏开发中使用 C# 的基础知识和常见问题。从 `MonoBehavior` 类的基础用法,到变量和属性的管理,再到空引用异常、资源管理和性能优化等常见问题的解决方法。文章还探讨了单例模式、事件系统和数据持久化等高级话题,旨在帮助开发者避免常见错误,提升游戏开发效率。
751 4