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

    注: 该博客为扩展型;

  • 相关阅读:
    for, 类型转换和使用方法
    笔记,随时更改
    控制流程之while循环, for循环
    赋值,逻辑,运算符, 控制流程之if 判断
    常量,基本数据类型,输入输出,基本运算符
    介绍python由来, 安装python3.8.3 及其变量的定义, 小整数池
    数组去重多个条件
    vue 自定义指令
    截取指定名字的url参数
    常用的js
  • 原文地址:https://www.cnblogs.com/yinwei-space/p/10065776.html
Copyright © 2011-2022 走看看