项目场景:
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); //保存图片方式二