繁体   English   中英

Basler Pylon 4 SDK和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。

这是一个更好的解决方案:

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);
}

我似乎无法发表评论,但要完成上述答案:

替换后它对我有用:

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);

注意高度的宽度

为了修复转换为OpenCV数据( 您的图像 ),您可以通过这种方式复制缓冲区

Mat image(target.GetHeight(), target.GetWidth(), CV_8UC3);
memcpy(image.ptr(),target.GetBuffer(),3*target.GetWidth()*target.GetHeight());

它对我有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM