zoukankan      html  css  js  c++  java
  • QImage与cv::Mat转换;

    QImage主要格式有QImage::Format_RGB32, QImage::Format_RGB888, QImage::Format_Index8, 不同的格式有不同的排布:

    格式部分可以参考: https://blog.csdn.net/aizhaoyu/article/details/12611611

      QImage::Format_RGB32,存入格式为B,G,R,A 对应 0,1,2,3
         QImage::Format_RGB888,存入格式为R, G, B 对应 0,1,2
        QImage::Format_Indexed8,需要设定颜色表,QVector<QRgb>

    opencv的Mat类默认是按照B,G,R进行排布的,因而,在QImage转换为 opencv的Mat时,根据不同的格式类型要进行R,B互换;

    QImage ------>  cv::Mat

    /**
     * @brief  Image ----- > mat
     * @param image
     * @return
     */
    void  ImgCvt::QImage2cvMat(QImage& image, cv::Mat **pImg)
    {
        qDebug() << image.format();
        switch(image.format())
        {
        case QImage::Format_ARGB32:
        case QImage::Format_RGB32:
        case QImage::Format_ARGB32_Premultiplied:
            *pImg  =new cv::Mat(image.height(), image.width(), CV_8UC4, (void*)image.constBits(), image.bytesPerLine());
            break;
        case QImage::Format_RGB888:                 
        {
            *pImg = new cv::Mat(image.height(), image.width(), CV_8UC3, (void*)image.constBits(), image.bytesPerLine());
             cv::cvtColor(**pImg, **pImg, CV_BGR2RGB);                                          //QImage Format_RGB888是按照R,G,B排布,  Mat按照B,G,R排布, 因而,需要进行互换;
            break;
        }
        case QImage::Format_Indexed8:
            *pImg = new  cv::Mat(image.height(), image.width(), CV_8UC1, (void*)image.constBits(), image.bytesPerLine());
            break;
        }
    }

    cv::Mat ---> QImage

    QImage ImgCvt::cvmatToQImage(cv::Mat mat)
    {
        switch ( mat.type() )
        {
        // 8位4通道
        case CV_8UC4:
        {
            QImage image( mat.data, mat.cols, mat.rows, mat.step, QImage::Format_RGB32 );
            return image;
        }
    
            // 8位3通道
        case CV_8UC3:
        {
            QImage image( mat.data, mat.cols, mat.rows, mat.step, QImage::Format_RGB888 );
            return image.rgbSwapped();
        }
    
            // 8位单通道
        case CV_8UC1:
        {
            static QVector<QRgb>  sColorTable;
            // only create our color table once
            if ( sColorTable.isEmpty() )
            {
                for ( int i = 0; i < 256; ++i )
                    sColorTable.push_back( qRgb( i, i, i ) );
            }
            QImage image( mat.data, mat.cols, mat.rows, mat.step, QImage::Format_Indexed8 );
            image.setColorTable( sColorTable );
            return image;
        }
    
        default:
            qDebug("Image format is not supported: depth=%d and %d channels
    ", mat.depth(), mat.channels());
            break;
        }
        return QImage();
    
    }

    注: 该博客为扩展型;

  • 相关阅读:
    趣谈多线程
    使用application manifest file
    参加一个.NET培训后的若干笔记
    遍历sql server数据库的简单方法
    为什么对继承的方法签名检查这么严格?
    Serialize Dictionary to xml using DataContractSerializer
    如何在sql中查询xml字符串
    从PowerDesigner概念设计模型(CDM)中的3种实体关系说起
    using "code coverage coloring" to help debuging
    日常工作中用到过的PowerShell指令
  • 原文地址:https://www.cnblogs.com/yinwei-space/p/10065776.html
Copyright © 2011-2022 走看看