首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Basler Pylon 4 SDK和OPENCV 2.4.9,CPylonImage to Mat

Basler Pylon 4 SDK和OPENCV 2.4.9,CPylonImage to Mat
EN

Stack Overflow用户
提问于 2014-06-08 00:24:53
回答 4查看 11.1K关注 0票数 3

我目前正在开发一个使用Basler摄像机acA1300-30 am的机器视觉应用程序。为此,我正在使用Basler Pylon 4和OPENCV版本2.4.9,并且出现了一些问题。我正试图使用Pylon捕获一个图像,并将其转换为Mat格式以进行进一步的分析。由于处理时间的限制,我的目标是避免将图像保存到硬盘上,而是进行动态分析。

在下面的代码中,我尝试捕获图像,将其转换为Mat格式,并将其显示在一个新的窗口上,但是我得到的窗口是空的。如果有人能帮我找出我的错误,或者解释我如何以不同的方式达到我的目标,我将非常感激。(我可能应该补充一下,相机工作正常,我已经能够将图像保存到硬盘中)。

谢谢。

这是我的代码:

代码语言:javascript
复制
    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;
        }
    }
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-06-09 07:35:43

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

票数 6
EN

Stack Overflow用户

发布于 2014-06-27 08:22:38

我似乎无法发表评论,但要完整地回答上面的问题:

它对我有用,因为它取代了:

代码语言:javascript
复制
Mat image(target.GetWidth(),target.GetHeight(),CV_16UC3,target.GetBuffer(),Mat::AUTO_STEP);

通过

代码语言:javascript
复制
Mat image(target.GetHeight(),target.GetWidth(),CV_16UC3,target.GetBuffer(),Mat::AUTO_STEP);

注高宽度

票数 1
EN

Stack Overflow用户

发布于 2014-08-11 12:31:33

为了修复对OpenCV数据(你的形象)的转换,可以以这种方式复制缓冲区

代码语言:javascript
复制
Mat image(target.GetHeight(), target.GetWidth(), CV_8UC3);
memcpy(image.ptr(),target.GetBuffer(),3*target.GetWidth()*target.GetHeight());

对我起作用了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24101877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档