• Basler相机Bayer格式转Qt RGB888


    【推荐养成的习惯】

    1、函数返回bool

    2、函数内优先判断参数是否存在可用

    3、使用try  catch

    【正题】

    无论什么品牌的相机,Bayer转RGB都涉及到插值,因此建议使用官方SDK里的函数进行转换。针对Basler相机,代码如下:

    bool BaslerCamera::toQImage(const CGrabResultPtr& ptrGrabResult, QImage& OutImage)    //输出型参数用&修饰,因为它是要被改变的。
    {    
        if (ptrGrabResult ==NULL)    //判断是否存在
        {
            return false;
        }
        try
        {
            int width = static_cast<int>(ptrGrabResult->GetWidth());
            int height = static_cast<int>(ptrGrabResult->GetHeight());
            if (ptrGrabResult->GetPixelType() == Pylon::PixelType_Mono8)
            {
                uchar* buffer = (uchar*)ptrGrabResult->GetBuffer();
                OutImage = QImage(buffer, width, height, QImage::Format_Grayscale8).copy();//深拷贝,防止 QPixmap::fromImage(img)访问冲突
            }
            else //bayer格式等
            {
                try
                {
                    CImageFormatConverter   fc;
                    fc.OutputPixelFormat = PixelType_RGB8packed;//通过官方函数先转为 RGB8
                    CPylonImage tempImg, copyImg;
                    
                    //方式一:
                    //fc.Convert(tempImg, ptrGrabResult);            
                    //uchar* buffer = (uchar*)tempImg.GetBuffer();
    
                    //方式二:
                    tempImg.AttachGrabResultBuffer(ptrGrabResult);
                    fc.Convert(copyImg, tempImg);                //此函数可能失败,因此放到try中            
                    uchar* buffer = (uchar*)copyImg.GetBuffer();
                    
                    OutImage = QImage(buffer, width, height, QImage::Format_RGB888).copy();
                }
                catch (const Pylon::GenericException& e)
                {
                    qDebug() << "官方函数格式转换失败" + QString(e.GetDescription());
                    return false;
                }
            }
        }
        catch (const Pylon::GenericException& e)
        {
            qDebug() << "失败" + QString(e.GetDescription());
            return false;
        }    
    
        return true;
    }

    【注意】

    ptrGrabResult的转换、获取(先清空再存数据)会有访问冲突,注意这两个位置要加锁。

    【多余的话】

    官方有下图函数,但是貌似没用。因此使用 CImageFormatConverter

  • 相关阅读:
    OCS 2007 R2单机测试虚拟环境的搭建(windows server 2008 R2 x64)
    Linq的概念解析
    WCF Data Service与net.tcp承载分析
    codeplex上20个有意思的WPF程序
    各种SmartPhone上的跨平台开源框架的总结
    新开发Apple Store上软件的实施步骤
    VSTO应用程序中加入键盘钩子
    绝非偶然 苹果iPhone领先5年背后的迷思 【推荐】
    Windows上安装Mac OS虚拟机
    Visual Studio 远程调试的步骤
  • 原文地址:https://www.cnblogs.com/xixixing/p/16650915.html
Copyright © 2020-2023  润新知