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
二维码