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

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

项目场景

Baumer工业相机堡盟相机是一种高性能、高质量的工业相机,可用于各种应用场景,如物体检测、计数和识别、运动分析和图像处理。  


Baumer的万兆网相机拥有出色的图像处理性能,可以实时传输高分辨率图像。此外,该相机还具有快速数据传输、低功耗、易于集成以及高度可扩展性等特点。


Baumer工业相机堡盟相机传统开发包BGAPI SDK进行工业视觉软件整合时,常常需要将SDK中采集的图像数据转换为适合图像格式如Bitmap等,再进行图像处理从而开启图像处理任务;


Baumer工业相机堡盟相机的SDK目前有两种类型:BGAPI SDK和NEOAPI SDK ;


目前BGAPI SDK使用的比较多,这里主要涉及BGAPI SDK相关的图像转换知识;


本文承接上文C++模式的Mat转换:


Baumer工业相机堡盟相机BGAPI SDK联合OpenCV进行Mat图像转换(C++)_格林威的博客-CSDN博客


问题描述

Baumer工业相机BGAPI SDK中图像数据为一般数据格式,C#一般经常转换为BGAPI2.Image格式,下图代码提供的图像数据转换为BGAPI2.Image的数据格式。


BGAPI2.ImageProcessor pImgProcessor;
BGAPI2.Image pImage = pImgProcessor.CreateImage((uint)mBufferFilled.Width, (uint)mBufferFilled.Height, mBufferFilled.PixelFormat, mBufferFilled.MemPtr, mBufferFilled.MemSize);
BGAPI2.Image pTranImage = pImgProcessor.CreateTransformedImage(pImage, "Mono8");


这里的ImageProcessor是SDK自带的图像转换函数,若需要转换为Mat数据,又需要进行一次BGAPI2.Image格式转为Mat格式,显得较为繁琐,下面则是通过上面的pTranImage 再进行转换为Bitmap的代码

int w = 0;
int h = 0;
w = (int)pTranImage.Width;
h = (int)pTranImage.Height;
imagebuffer = pTranImage.Buffer;
string PixelFormatstr = mBufferFilled.PixelFormat;
if (PixelFormatstr.Contains("Mono8"))
{
    if (actform.bFirstFrame)
    {
        actform.pImgBits = new Byte[w * h];
        //actform.pBitmap = new Bitmap(w,h,PixelFormat.Format8bppIndexed);
        //pBitmap = new System.Drawing.Bitmap(w,h,System.Drawing.Imaging.PixelFormat.Format8bppIndexed);
        // actform.pBitmap = new System.Drawing.Bitmap(w,h,System.Drawing.Imaging.PixelFormat.Format8bppIndexed);
        actform.pBitmap = new System.Drawing.Bitmap(w, h, System.Drawing.Imaging.PixelFormat.Format8bppIndexed);
        actform.prcSource.X = 0;
        actform.prcSource.Y = 0;
        actform.prcSource.Width = w;
        actform.prcSource.Height = h;
        actform.bFirstFrame = false;
    }
}
System.Drawing.Imaging.BitmapData bmpdata;
System.Drawing.Imaging.BitmapData bmpdata2;
if (PixelFormatstr.Contains("Mono8"))
{
    System.Drawing.Imaging.ColorPalette palette = actform.pBitmap.Palette;
    for (int i = 0; i < 256; i++)
    {
        palette.Entries[i] = Color.FromArgb(255, i, i, i);
    }
    actform.pBitmap.Palette = palette;
}
if (PixelFormatstr.Contains("Mono8"))
    bmpdata = actform.pBitmap.LockBits(actform.prcSource,         
System.Drawing.Imaging.ImageLockMode.WriteOnly,             
System.Drawing.Imaging.PixelFormat.Format8bppIndexed);
else
    bmpdata = actform.pBitmap.LockBits(actform.prcSource, System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
if (PixelFormatstr.Contains("Mono8"))
{
    System.Runtime.InteropServices.Marshal.Copy(imagebuffer, actform.pImgBits, 0, w * h);
    System.Runtime.InteropServices.Marshal.Copy(actform.pImgBits, 0, bmpdata.Scan0, w * h);
}
else
{
    System.Runtime.InteropServices.Marshal.Copy(imagebuffer, actform.pImgBits, 0, w * h * 3);
    System.Runtime.InteropServices.Marshal.Copy(actform.pImgBits, 0, bmpdata.Scan0, w * h * 3);
}
actform.pBitmap.UnlockBits(bmpdata);
.

解决方案

下面提供Baumer工业相机BGAPI SDK的相机数据直接转为Mat数据的c#代码


这里提供了相机SDK中原始的图像数据直接转为bitmap的代码

System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap((int)mBufferFilled.Width, (int)mBufferFilled.Height, (int)mBufferFilled.Width, System.Drawing.Imaging.PixelFormat.Format8bppIndexed, (IntPtr)((ulong)mBufferFilled.MemPtr + mBufferFilled.ImageOffset));
System.Drawing.Imaging.ColorPalette palette = bitmap.Palette;
int nColors = 256;
for (int ix = 0; ix < nColors; ix++)
{
    uint Alpha = 0xFF;
    uint Intensity = (uint)(ix * 0xFF / (nColors - 1));
    palette.Entries[ix] = System.Drawing.Color.FromArgb((int)Alpha, (int)Intensity,             (int)Intensity, (int)Intensity);
}
bitmap.Palette = palette;
Bitmap clone = (Bitmap)bitmap.Clone();
BitmapData data = clone.LockBits(new Rectangle(0, 0, clone.Width, clone.Height), ImageLockMode.ReadOnly, clone.PixelFormat);
clone.UnlockBits(data);

注意

为什么需要对图像数据进行快速转换?


工业相机中图像原始数据的转换速度至关重要,因为它决定了相机捕捉和处理图像的速度。


在工厂自动化、基于视觉的检查和监控等行业中,实时图像捕捉和处理是必不可少的。


高转换速度确保摄像机能够快速捕捉图像,并将原始数据实时转换为可显示的格式。


这种速度在高吞吐量的应用中至关重要,在这种应用中,即使是图像转换的微小延迟也会影响整个系统的效率。

目录
相关文章
|
4月前
|
监控 API 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取每张图像的微秒时间和FrameID功能(C#)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取每张图像的微秒时间和FrameID功能(C#)
75 0
|
4月前
|
数据采集 API 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用ForceIP强制修改网口IP功能(C#)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用ForceIP强制修改网口IP功能(C#)
51 0
|
4月前
|
编解码 监控 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用Binning像素合并功能(C#)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用Binning像素合并功能(C#)
45 0
|
3月前
|
存储 算法 API
OpenCV 3.1.0中的Mat对象使用
OpenCV 3.1.0中的Mat对象使用
19 2
|
4月前
|
监控 API 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取每张图像的微秒时间和FrameID功能(C++)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取每张图像的微秒时间和FrameID功能(C++)
62 0
|
3月前
|
存储 编解码 API
【图像文本化】Base64编解码OpenCV4中 Mat 对象
【图像文本化】Base64编解码OpenCV4中 Mat 对象
42 0
|
9天前
|
算法 计算机视觉 Python
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
该文章详细介绍了使用Python和OpenCV进行相机标定以获取畸变参数,并提供了修正图像畸变的全部代码,包括生成棋盘图、拍摄标定图像、标定过程和畸变矫正等步骤。
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
WK
|
7天前
|
编解码 计算机视觉 Python
如何在OpenCV中进行图像转换
在OpenCV中,图像转换涉及颜色空间变换、大小调整及类型转换等操作。常用函数如`cvtColor`可实现BGR到RGB、灰度图或HSV的转换;`resize`则用于调整图像分辨率。此外,通过`astype`或`convertScaleAbs`可改变图像数据类型。对于复杂的几何变换,如仿射或透视变换,则可利用`warpAffine`和`warpPerspective`函数实现。这些技术为图像处理提供了强大的工具。
WK
34 1
|
25天前
|
机器人 计算机视觉
巧用 OpenCV solvePnP() 函数完成由图像坐标系到机器人坐标系的转换(二维坐标系之间的转换)
巧用 OpenCV solvePnP() 函数完成由图像坐标系到机器人坐标系的转换(二维坐标系之间的转换)
35 2
|
2月前
|
机器学习/深度学习 XML 计算机视觉
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。
下一篇
DDNS