Basler Pylon 4 SDK and OPENCV 2.4.9, CPylonImage to Mat
Basler Pylon 4 SDK and OPENCV 2.4.9, CPylonImage to Mat
我目前正在使用Basler相机acA1300-30gc开发机器视觉应用程序。为此,我正在使用Basler Pylon 4和OPENCV 2.4.9版本,并且出现了一些问题。我试图使用Pylon SDK捕获图像并将其转换为Mat格式以进行进一步分析。由于处理时间的限制,我的目标是避免将图像保存到硬盘驱动器,而是实时分析它。
在以下代码中,我尝试捕获图像,将其转换为Mat格式并在新窗口上显示,但我得到的窗口是空白的。如果有人能帮助我指出我的错误,或者解释我如何用另一种方式达到我的目标,我将非常感激。(我可能应该补充说,相机工作正常,我已经能够将图像保存到硬盘驱动器)。
谢谢。下面是我的代码:
PylonAutoInitTerm autoInitTerm;
try
{
CInstantCamera camera( CTlFactory::GetInstance().CreateFirstDevice());
cout << "Dispositivo usado:"<<camera.GetDeviceInfo().GetModelName()<<endl;
CGrabResultPtr ptrGrabResult;
camera.GrabOne(500,ptrGrabResult,TimeoutHandling_ThrowException);
if(ptrGrabResult->GrabSucceeded())
{
CPylonImage target;
CImageFormatConverter converter;
converter.OutputPixelFormat=PixelType_RGB8packed;
converter.OutputBitAlignment=OutputBitAlignment_MsbAligned;
converter.Convert(target,ptrGrabResult);
Mat image(target.GetWidth(),target.GetHeight(),CV_8UC1,target.GetBuffer(),Mat::AUTO_STEP);
if(image.empty())
{
cout << "No se pudo cargar la imagen Mat" << endl;
return -1;
}
cout << "La imagen se presenta en la ventana *Captura*" << endl;
namedWindow("Captura",WINDOW_AUTOSIZE);
imshow( "Captura", image );
}
else
{
cout<<"Error: "<<ptrGrabResult->GetErrorCode()<<" "<<ptrGrabResult->GetErrorDescription()<<endl;
}
}
您必须确保像素类型匹配。在您的代码示例中,您使用PixelType_RGB8packed
作为相机图像,并使用CV_8UC1
作为Mat像素类型。你应该用CV_8UC3
代替。此外,我会使用PixelType_BGR8packed
而不是PixelType_RGB8packed
,因为BGR与Windows位图兼容。我假设你用的是Windows。
我似乎不能发表评论,但要完成上面的回答:
替换后可以正常工作:
Mat image(target.GetWidth(),target.GetHeight(),CV_16UC3,target.GetBuffer(),Mat::AUTO_STEP);
Mat image(target.GetHeight(),target.GetWidth(),CV_16UC3,target.GetBuffer(),Mat::AUTO_STEP);
Height
为了修复到OpenCV数据(您的图像)的转换,您可以以这种方式复制缓冲区
Mat image(target.GetHeight(), target.GetWidth(), CV_8UC3);
memcpy(image.ptr(),target.GetBuffer(),3*target.GetWidth()*target.GetHeight());
这里有一个更好的解决方案:
CImageFormatConverter fc;
fc.OutputPixelFormat = PixelType_BGR8packed;
CPylonImage image;
if (ptrGrabResult->GrabSucceeded())
{
fc.Convert(image, ptrGrabResult);
Mat cv_img = cv::Mat(ptrGrabResult->GetHeight(), ptrGrabResult->GetWidth(), CV_8UC3,(uint8_t*)image.GetBuffer());
imshow(src_window,cv_img); // display the image in OpenCV image window
waitKey(1);
}
相关文章:
- "error: no matching function for call to"构造函数错误
- 调用专用模板时出错"no matching function for call to [...]"
- C++ Singleton - Prevent ::instance() to variable
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- Visual Studio Code "undefined reference to `WinMain@16'"
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 如何解决"invalid conversion from 'char' to 'const char*'"
- 使用 MATLAB 编码器生成C++代码:编译错误"undefined reference to `rgb2gray_tbb_real64'"
- 尝试链接我的着色器时,我收到错误代码"error c5145 must write to gl_position"
- Python str to C++ to Python str
- 为什么创建友元类的实例会导致"undefined reference to"错误?
- System.InvalidCastException - SQL to C++ - safe_cast<float>
- 使用 cmake 的 Linux 终端上的"Conversion to non-scalar type is requested"错误
- "no matching function for call to 'Vector::Vector'"错误
- vector<vector<double>> to mxArray using memcpy
- Tensorflow c++ api undefined reference to 'tflite::D efaultErrorReporter()'
- 当覆盖存在时调用基本虚拟"binded to object"函数
- OpenGL VBO Indexing ( How to compute Index Array)
- 为什么我会" void value not ignored as it ought to be"?
- Basler Pylon 4 SDK and OPENCV 2.4.9, CPylonImage to Mat