• OpenCV图片类cv::Mat和QImage之间进行转换(好多相关文章)


    在使用Qt和OpenCV混合编程时,我们有时需要在两种图片类cv::Mat和QImage之间进行转换,下面的代码参考了网上这个帖子

    复制代码
    //##### cv::Mat ---> QImage #####
    
    // Shallow copy
    QImage mat2qimage_ref(cv::Mat &m, QImage::Format format) {
        return QImage(m.data, m.cols, m.rows, m.step, format);
    }
    
    // Deep copy
    QImage mat2qimage_cpy(cv::Mat &m, QImage::Format format) {
        return QImage(m.data, m.cols, m.rows, m.step, format).copy();
    }
    
    //##### QImage ---> cv::Mat #####
    
    // Shallow copy
    cv::Mat qimage2mat_ref(QImage &img, int format) {
        return cv::Mat(img.height(), img.width(), format, img.bits(), img.bytesPerLine());
    }
    
    // Deep copy
    cv::Mat qimage2mat_ref(QImage &img, int format) {
        return cv::Mat(img.height(), img.width(), format, const_cast<uchar*>(img.bits()), img.bytesPerLine()).clone();
    }
    复制代码

    还可以用下面的这个代码,参考了这个帖子

    复制代码
    //##### cv::Mat ---> QImage #####
    QImage cvMat_to_QImage(const cv::Mat &mat ) {
      switch ( mat.type() )
      {
         // 8-bit, 4 channel
         case CV_8UC4:
         {
            QImage image( mat.data, mat.cols, mat.rows, mat.step, QImage::Format_RGB32 );
            return image;
         }
    
         // 8-bit, 3 channel
         case CV_8UC3:
         {
            QImage image( mat.data, mat.cols, mat.rows, mat.step, QImage::Format_RGB888 );
            return image.rgbSwapped();
         }
    
         // 8-bit, 1 channel
         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();
    }
    
    
    //##### QImage ---> cv::Mat #####
    cv::Mat QImage_to_cvMat( const QImage &image, bool inCloneImageData = true ) {
      switch ( image.format() )
      {
         // 8-bit, 4 channel
         case QImage::Format_RGB32:
         {
            cv::Mat mat( image.height(), image.width(), CV_8UC4, const_cast<uchar*>(image.bits()), image.bytesPerLine() );
            return (inCloneImageData ? mat.clone() : mat);
         }
    
         // 8-bit, 3 channel
         case QImage::Format_RGB888:
         {
            if ( !inCloneImageData ) {
               qWarning() << "ASM::QImageToCvMat() - Conversion requires cloning since we use a temporary QImage";
            }
            QImage swapped = image.rgbSwapped();
            return cv::Mat( swapped.height(), swapped.width(), CV_8UC3, const_cast<uchar*>(swapped.bits()), swapped.bytesPerLine() ).clone();
         }
    
         // 8-bit, 1 channel
         case QImage::Format_Indexed8:
         {
            cv::Mat  mat( image.height(), image.width(), CV_8UC1, const_cast<uchar*>(image.bits()), image.bytesPerLine() );
    
            return (inCloneImageData ? mat.clone() : mat);
         }
    
         default:
            qDebug("Image format is not supported: depth=%d and %d format
    ", image.depth(), image.format();
            break;
      }
    
      return cv::Mat();
    }
    复制代码

    http://www.cnblogs.com/grandyang/p/5602360.html

  • 相关阅读:
    PHP查找服务器某个目录下的文件
    CentOS添加用户,管理员权限
    centos图形化桌面安装过程
    正则表达式匹配查询
    Windows远程桌面多用户登录的问题
    VM虚拟机Android安装图形界面
    Ubuntu 根目录作用
    win7个性化不能换界面:此页面上的一个或多个设置已被系统管理员禁用,关机里的切换用户和锁定为灰色
    springboot 使用 jedis 连接 Redis 数据库
    JAVA 中 Map 与实体类相互转换的简单方法
  • 原文地址:https://www.cnblogs.com/findumars/p/5697758.html
Copyright © 2020-2023  润新知