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


目录
相关文章
|
数据采集 API 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用Force IP强制修改网口IP功能(C++)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用Force IP强制修改网口IP功能(C++)
271 0
|
编解码 监控 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用Binning像素合并功能(C++)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用Binning像素合并功能(C++)
220 0
|
监控 API 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取每张图像的微秒时间和FrameID功能(C++)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取每张图像的微秒时间和FrameID功能(C++)
249 0
|
存储 机器人 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK实现Bitmap的图像转换功能(C++)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK实现Bitmap的图像转换功能(C++)
314 0
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
11月前
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
443 12
|
9月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
237 0
|
9月前
|
存储 编译器 程序员
c++的类(附含explicit关键字,友元,内部类)
本文介绍了C++中类的核心概念与用法,涵盖封装、继承、多态三大特性。重点讲解了类的定义(`class`与`struct`)、访问限定符(`private`、`public`、`protected`)、类的作用域及成员函数的声明与定义分离。同时深入探讨了类的大小计算、`this`指针、默认成员函数(构造函数、析构函数、拷贝构造、赋值重载)以及运算符重载等内容。 文章还详细分析了`explicit`关键字的作用、静态成员(变量与函数)、友元(友元函数与友元类)的概念及其使用场景,并简要介绍了内部类的特性。
375 0
|
设计模式 安全 C++
【C++进阶】特殊类设计 && 单例模式
通过对特殊类设计和单例模式的深入探讨,我们可以更好地设计和实现复杂的C++程序。特殊类设计提高了代码的安全性和可维护性,而单例模式则确保类的唯一实例性和全局访问性。理解并掌握这些高级设计技巧,对于提升C++编程水平至关重要。
225 16
|
编译器 C语言 C++
类和对象的简述(c++篇)
类和对象的简述(c++篇)