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

项目场景:

特殊环境类项目,使用高速高稳定以及高防护的并自带JPEG图像压缩算法的Baumer相机作为相机主体,使用内置JPEG算法的相机可以保证图像质量的前提下提高图像传输速度。

相机型号:VLXN-650M.I.JP


问题描述

使用JPEG-650M相机进行开发时,使用Baumer China提供的标准Demo-CPP软件进行测试时,发现显示图像为一条灰色条纹图像,无法显示相机实际采集的图像。


原因分析:

通过确认发现,正常Demo-CPP显示JPEG相机的条纹图像为霍夫曼流信息,需要经过转译解码后才能显示为正常图像。


解决方案:

Baumer GAPI SDK中目前暂无直接转霍夫曼流为图像的函数,但是有提供将霍夫曼流通过流文件的方式保存为本地图片的函数,若需要解码霍夫曼流并显示图像,需要采用第三方库进行,如Opencv等,通过opencv的解码后将图像转为Mat后再转为bitmap,即可正常显示图像在Demo-CPP中;

下面我们关联C++的opencv环境

这里的路径已经设置好,安装的opencv环境为opencv3.4.1  需要的文件如下面所示  然后添加合适的头文件,opencv环境就安装ok    

包含目录:D:OPENCVopencv3.4.1buildinclude  

库目录:D:OPENCVopencv3.4.1buildx64vc14lib

#include <opencv2/core/core.hpp>   
#include <opencv2/highgui/highgui.hpp>  
#include<opencv2opencv.hpp>        
#pragma comment(lib, "opencv_world341.lib")  
#pragma comment(lib, "opencv_world341d.lib")        
#pragma region 内存JPEG数据转换为opencv里的jpeg
char* image_buffer = (char *)((bo_uint64)(pBufferFilled->GetMemPtr()) + pBufferFilled->GetImageOffset());
int image_length = (int)pBufferFilled->GetImageLength();
cv::Mat * imgbuf = new cv::Mat(cv::Size(1, image_length), CV_8UC1, (char *)image_buffer);
cv::Mat imOriginal = cv::imdecode(*imgbuf, CV_LOAD_IMAGE_GRAYSCALE);
#pragma endregion
//方法【1】原图像格式转换[mat转unsigned char]                       
unsigned char *imagebuffer2 = imOriginal.data;
//方法【2】原图像格式转换[mat转unsigned char]                       
int image_size = imOriginal.cols * imOriginal.rows;
unsigned char* imageData = new unsigned char[image_size];
int a = 0;
for (int i = 0;i<imOriginal.rows;i++)
{

            for (int j = 0;j<imOriginal.cols;j++)
            {

                        imageData[a]= imOriginal.at<uchar>(i, j);
                        a++;

            }
}

#pragma region//通过流文件的方式将JPEG的数据保存为jpg文件,但是这种操作是无法将数据转为内存bitmap的,转换需要第三方软件如opencv
std::ofstream outfile;
outfile.open(strpath, std::ios_base::binary);            
outfile.write(reinterpret_cast<const char*>(pBufferFilled->GetMemPtr()) + jpeg_start_offset2, jpeg_end_offset2 - jpeg_start_offset2);
#pragma endregion

#pragma region//Mat保存图片功能
CString  strpath2 = pDlg->m_strDirectory+strtime+"Mat.jpg";
cv::String cvstrpath = W2A(strpath2);
cv::imwrite(cvstrpath,imOriginal);
#pragma endregion

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>