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); //保存图片方式二


目录
相关文章
|
20天前
|
存储 算法 Linux
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
43 6
|
2月前
|
存储 资源调度 算法
Opencv(C++)系列学习---SIFT、SURF、ORB算子特征检测
Opencv(C++)系列学习---SIFT、SURF、ORB算子特征检测
|
24天前
|
人工智能 机器人 Linux
【C++】Linux下如何查看opencv的版本
【C++】Linux下如何查看opencv的版本
|
2月前
|
算法 C++ 计算机视觉
Opencv(C++)学习系列---Laplacian拉普拉斯边缘检测算法
Opencv(C++)学习系列---Laplacian拉普拉斯边缘检测算法
|
2月前
|
算法 计算机视觉 C++
Opencv(C++)学习系列---Sobel索贝尔算子边缘检测
Opencv(C++)学习系列---Sobel索贝尔算子边缘检测
|
2月前
|
算法 C++ 计算机视觉
Opencv(C++)学习系列---Canny边缘检测算法
Opencv(C++)学习系列---Canny边缘检测算法
|
2月前
|
存储 计算机视觉 C++
Opencv(C++)学习系列---特征点检测和匹配
Opencv(C++)学习系列---特征点检测和匹配
|
10天前
|
JavaScript Java Maven
云效产品使用常见问题之android sdk 构建出aar后,上传到私有maven仓库失败如何解决
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
4月前
|
安全 开发工具 Android开发
几个Flutter常见诊断错误与解决Android toolchain - develop for Android devices X Unable to locate Android SDK
几个Flutter常见诊断错误与解决Android toolchain - develop for Android devices X Unable to locate Android SDK
318 0
|
7月前
|
API 开发工具 Android开发
解决 Android App 上架 Google play后 ,签名变更,第三方sdk无法登录
解决 Android App 上架 Google play后 ,签名变更,第三方sdk无法登录
151 0