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

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

项目场景:

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


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


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


注意:本文描述的为Baumer工业相机的常用型号,非JPEG这种图像压缩预处理相机,


JPEG相机的图像数据转换为Mat格式详见下面博客链接:


Baumer相机BGAPI SDK Demo软件去连接JPEG-650M相机进行采图时,发现图像显示为一条灰色条状图像(C++),联合OpenCV进行图像转换显示_格林威的博客-CSDN博客


问题描述

Baumer工业相机BGAPI SDK中图像数据为一般数据格式,一般经常转换为Bitmap格式,BGAPI中也提供的对应的函数进行转换,下图代码提供的图像数据转换为Gdiplus Bitmap的数据格式。

unsigned char* imagebuffer = (BYTE*)((bo_int64)pBufferFilled->GetMemPtr()+pBufferFilled->GetImageOffset());//获取当前图像数据
#pragma region 黑白相机代码:像素格式为mono时转Bitmap的代码,彩色相机此处代码不同
if(pDlg->m_pBitmap == NULL)
{
    pDlg->m_pBitmap = new Gdiplus::Bitmap(width,height,PixelFormat8bppIndexed);
}
Gdiplus::BitmapData lockedbits;
Gdiplus::ColorPalette * pal = (Gdiplus::ColorPalette*)new BYTE[sizeof(Gdiplus::ColorPalette)+255*sizeof(Gdiplus::ARGB)];
pal->Count=256;
for(UINT i=0;i<256;i++)
{
    UINT color=i*65536+i*256+i;
    color= color|0xFF000000;
    pal->Entries[i]=color;
}
pDlg->m_pBitmap->SetPalette(pal);
Gdiplus::Status ret = pDlg->m_pBitmap->LockBits(&rc,Gdiplus::ImageLockModeWrite,PixelFormat8bppIndexed,&lockedbits);
BYTE* pixels = (BYTE*)lockedbits.Scan0;
BYTE* src = (BYTE*)imagebuffer;
for (int row = 0; row < height; ++row) 
{
    CopyMemory(pixels, src, lockedbits.Stride);
    pixels += width;
    src += width;
}
pDlg->m_pBitmap->UnlockBits(&lockedbits);
#pragma endregion

但是若需要使用OpenCV的格式则还需要从Bitmap转为Mat,变得更为复杂,甚至可能影响处理速度。


原因分析:

Baumer工业相机BGAPI SDK的相机数据需要能直接转换为OpenCV的图像格式Mat。


通过Bitmap是可以直接转换为Mat,但是较为复杂。


解决方案:

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


cv::Mat* imgbuf2 = new cv::Mat((int)pBufferFilled->GetHeight(),(int)pBufferFilled->GetWidth(),CV_8UC1,(char *)pBufferFilled->GetMemPtr());
cv::Mat imOriginal2 = cv::imdecode(*imgbuf2, CV_LOAD_IMAGE_GRAYSCALE); //将Mat指针数据转换为Mat数据
cv::imwrite(cvstrpath, *imgbuf2); //保存图片方式一
cv::imwrite(cvstrpath, imOriginal2); //保存图片方式二


目录
相关文章
|
6月前
|
存储 算法 Linux
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
230 7
|
5月前
|
算法 开发工具 计算机视觉
【零代码研发】OpenCV实验大师工作流引擎C++ SDK演示
【零代码研发】OpenCV实验大师工作流引擎C++ SDK演示
85 1
|
3月前
|
传感器 定位技术 C++
基于C++的GDAL用空白栅格填充长时间序列遥感影像中的缺失图像
然后,定义需要处理的遥感影像路径列表,和识别数据缺失的逻辑。这里我们简化处理,假设已经知道哪一幅图像是缺失的,因此直接跳过识别步骤。
61 1
|
5月前
|
存储 算法 API
OpenCV 3.1.0中的Mat对象使用
OpenCV 3.1.0中的Mat对象使用
39 2
|
5月前
|
存储 编解码 API
【图像文本化】Base64编解码OpenCV4中 Mat 对象
【图像文本化】Base64编解码OpenCV4中 Mat 对象
91 0
|
5月前
|
计算机视觉 C++
【见微知著】OpenCV中C++11 lambda方式急速像素遍历
【见微知著】OpenCV中C++11 lambda方式急速像素遍历
52 0
|
5月前
|
算法 Java API
在VC++中使用CxImage库读写图像实现像素操作
在VC++中使用CxImage库读写图像实现像素操作
38 0
|
6月前
|
算法 C++ 计算机视觉
Opencv(C++)学习系列---Laplacian拉普拉斯边缘检测算法
Opencv(C++)学习系列---Laplacian拉普拉斯边缘检测算法
304 0
|
6月前
|
算法 计算机视觉 C++
Opencv(C++)学习系列---Sobel索贝尔算子边缘检测
Opencv(C++)学习系列---Sobel索贝尔算子边缘检测
168 0
|
6月前
|
算法 C++ 计算机视觉
Opencv(C++)学习系列---Canny边缘检测算法
Opencv(C++)学习系列---Canny边缘检测算法
183 0