【问题标题】:Basler Pylon 4 SDK and OPENCV 2.4.9, CPylonImage to MatBasler Pylon 4 SDK 和 OPENCV 2.4.9,CPylonImage 到 Mat
【发布时间】:2014-07-28 21:46:21
【问题描述】:

我目前正在使用 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;
        }
    }

【问题讨论】:

    标签: c++ opencv computer-vision


    【解决方案1】:

    您必须确保像素类型匹配。在您的代码示例中,您使用 PixelType_RGB8packed 作为相机图像,并使用 CV_8UC1 作为 Mat 像素类型。你应该改用CV_8UC3。另外我会使用PixelType_BGR8packed 而不是PixelType_RGB8packed,因为BGR 与Windows 位图兼容。我假设您使用 Windows。

    【讨论】:

    • 这很有效,因为我现在可以根据需要转换图像,但我还有一个问题。我得到的图像是它应该是的重复片段,出了什么问题?
    • 我不确定我理解你的意思。也许你可以发布一张图片?
    • 这是我从程序dropbox.com/s/dyeeyv0cnj4ovq1/CapturaError.JPG获取的图像这是我想要捕获的图像(使用Pylon查看器获得)dropbox.com/s/vnb9wcpee73ko8z/testImage.tiff
    • 我不认为这是由转换为 OpenCV 数据引起的。看起来像是一些错误的拜耳过滤器转换。我建议尝试转换器和/或相机设置的其他设置,或者向 Basler 寻求支持。
    【解决方案2】:

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

    替换后对我有用:

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

    注意高度的宽度

    【讨论】:

      【解决方案3】:

      这里有一个更好的解决方案:

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

      【讨论】:

      • 你能解释一下为什么它更好吗?
      • 可能是我用错了词。使用 pylon sdk 更容易做到这一点
      【解决方案4】:

      为了修复转换为 OpenCV 数据 (your image) 你可以用这种方式复制缓冲区

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

      它对我有用。

      【讨论】:

        猜你喜欢
        • 2014-09-30
        • 1970-01-01
        • 2021-12-29
        • 1970-01-01
        • 2022-01-12
        • 2017-01-18
        • 2022-08-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多