项目场景:
Baumer工业相机堡盟相机是一种高性能、高质量的工业相机,可用于各种应用场景,如物体检测、计数和识别、运动分析和图像处理。
Baumer的万兆网相机拥有出色的图像处理性能,可以实时传输高分辨率图像。此外,该相机还具有快速数据传输、低功耗、易于集成以及高度可扩展性等特点。
特殊环境类项目,使用高速高稳定以及高防护的并自带JPEG图像压缩算法的Baumer相机作为相机主体,使用内置JPEG算法的相机可以保证图像质量的前提下提高图像传输速度。
相机型号:VLXN-650M.I.JP
问题描述:
使用JPEG-650M相机进行开发时,使用Baumer China提供的标准Demo-CPP软件进行测试时,发现显示图像为一条灰色条纹图像,无法显示相机实际采集的图像。
原因分析:
Baumer JPEG系列工业相机的内部图像数据为霍夫曼流动图像。
正常Demo-CPP显示的图像为正常原始数据图像,需要经过转译解码后才能显示为正常图像。
霍夫曼流动图像显示为灰色图像,因为它代表了流动模式的灰度渲染。
在这种类型的可视化中,灰色的强度对应于局部速度或流速。
较暗的区域表示较低的流速,而较亮的区域表示较高的流速。
这种灰度表示法允许以简单直观的方式对复杂的流体流动进行轻松的可视化和分析。
解决方案:
Baumer GAPI SDK中目前暂无直接转霍夫曼流为图像的函数,
但是有提供将霍夫曼流通过流文件的方式保存为本地图片的函数,
若需要解码霍夫曼流并显示图像,需要采用第三方库进行,如Opencv等,
通过opencv的解码后将图像转为Mat后再转为bitmap,即可正常显示图像在Demo-CPP中;
下面我们关联C++的opencv环境
这里的路径已经设置好,安装的opencv环境为opencv3.4.1 需要的文件如下面所示 然后添加合适的头文件,opencv环境就安装ok
包含目录:D:\OPENCV\opencv3.4.1\build\include
库目录:D:\OPENCV\opencv3.4.1\build\x64\vc14\lib
#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include<opencv2\opencv.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
霍夫曼图像优点
霍夫曼图像,也被称为霍夫曼调制对比度图像,具有以下特点。
1. 它们是通过一种专门的技术产生的,该技术增强了透明或半透明的标本,如细胞或组织的对比度。
2. 由于调制对比技术产生的阴影,它们具有三维的外观。
3. 它们可以显示出传统明场或相位对比显微镜难以看到的精细细节。
4. 它们对研究活细胞特别有用,因为该技术不需要对细胞进行染色或固定。
5. 它们可以用专门的光学仪器和软件来捕捉,并经常用于生物研究和医疗诊断。