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

  1. /**
  2. * @brief Image ----- > mat
  3. * @param image
  4. * @return
  5. */
  6. void ImgCvt::QImage2cvMat(QImage& image, cv::Mat **pImg)
  7. {
  8. qDebug() << image.format();
  9. switch(image.format())
  10. {
  11. case QImage::Format_ARGB32:
  12. case QImage::Format_RGB32:
  13. case QImage::Format_ARGB32_Premultiplied:
  14. *pImg =new cv::Mat(image.height(), image.width(), CV_8UC4, (void*)image.constBits(), image.bytesPerLine());
  15. break;
  16. case QImage::Format_RGB888:
  17. {
  18. *pImg = new cv::Mat(image.height(), image.width(), CV_8UC3, (void*)image.constBits(), image.bytesPerLine());
  19. cv::cvtColor(**pImg, **pImg, CV_BGR2RGB);                                          //QImage Format_RGB888是按照R,G,B排布, Mat按照B,G,R排布, 因而,需要进行互换;
  20. break;
  21. }
  22. case QImage::Format_Indexed8:
  23. *pImg = new cv::Mat(image.height(), image.width(), CV_8UC1, (void*)image.constBits(), image.bytesPerLine());
  24. break;
  25. }
  26. }

cv::Mat ---> QImage

  1. QImage ImgCvt::cvmatToQImage(cv::Mat mat)
  2. {
  3. switch ( mat.type() )
  4. {
  5. // 8位4通道
  6. case CV_8UC4:
  7. {
  8. QImage image( mat.data, mat.cols, mat.rows, mat.step, QImage::Format_RGB32 );
  9. return image;
  10. }
  11.  
  12. // 8位3通道
  13. case CV_8UC3:
  14. {
  15. QImage image( mat.data, mat.cols, mat.rows, mat.step, QImage::Format_RGB888 );
  16. return image.rgbSwapped();
  17. }
  18.  
  19. // 8位单通道
  20. case CV_8UC1:
  21. {
  22. static QVector<QRgb> sColorTable;
  23. // only create our color table once
  24. if ( sColorTable.isEmpty() )
  25. {
  26. for ( int i = ; i < ; ++i )
  27. sColorTable.push_back( qRgb( i, i, i ) );
  28. }
  29. QImage image( mat.data, mat.cols, mat.rows, mat.step, QImage::Format_Indexed8 );
  30. image.setColorTable( sColorTable );
  31. return image;
  32. }
  33.  
  34. default:
  35. qDebug("Image format is not supported: depth=%d and %d channels\n", mat.depth(), mat.channels());
  36. break;
  37. }
  38. return QImage();
  39.  
  40. }

注: 该博客为扩展型;

QImage与cv::Mat转换;的更多相关文章

  1. QImage 与 cv::Mat 之间的相互转换

    近期做图像处理方面的项目比較多,非常多算法自己从头写的话太浪费时间,并且自己写的也不一定完好,早就听说OpenCV在图像处理算法方面功能非常强大,一直没时间学习,这次正好项目用到了.暂时抱佛脚学习些O ...

  2. Qt QImage与OpenCV Mat转换

    本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/51029382 应一个朋友的要求,整理总 ...

  3. cv::mat转换成QImage的问题

    在进行cv::mat转换为QImage过程中,经常出现问题: cv::Mat image; ...QImage img=QImage((const unsigned char*)(image.data ...

  4. cv::Mat转换QImage

    cvtColor(img, img, CV_BGR2RGB); QImage image((uchar*)img.data,img.cols,img.rows,QImage::Format_RGB88 ...

  5. CvArr* to cv::Mat 转换

    OpenCV中的CvArr*的定义的一个空类型的指针,可以转换为其派生类CvMat和IplImage,那么如何将其转化为cv::Mat呢,其实很简单,只需要一行代码即可: // CvArr *_img ...

  6. Convert between cv::Mat and QImage 两种图片类转换

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

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

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

  8. 【资料收集】Converting Between cv::Mat and QImage or QPixmap

    参考: 方法一 Convert between cv::Mat and QImage 两种图片类转换 - Grandyang - 博客园 http://www.cnblogs.com/grandyan ...

  9. cv::Mat到YUV420的转换《转》

    某些特定场合我们会经常遇到yuv420格式的视频文件,这种视频帧无法直接用于opencv,故而,需要进行格式转换:幸运的是,opencv提供了rgb到yuv420的格式转换函数:下面给出基本用法: 函 ...

随机推荐

  1. How to split DMG on macOS

    hdiutil segment /users/test/test1.dmg -segmentsize 4000m -o /users/test/test2.dmg

  2. Nginx Epoll事件模型优劣

    L30-31 Epoll 性能优势主要源于它不用遍历 假设有100万个链接 其它事件可能都需要遍历所有链接,而Epoll只要遍历活跃的链接,这样大大提升了效率

  3. python基础数据类型--list列表

    列表: 列表是python中的基础数据类型之一,其他语言中也有类似于列表的数据类型,比如js中叫数组,他是以[]括起来,每个元素以逗号隔开,而且他里面可以存放各种数据类型比如: li = [‘alex ...

  4. Spring 使用介绍(七)—— Spring事务

    一.数据库事务概述 1.基本介绍 事务必需满足ACID(原子性.一致性.隔离性和持久性)特性,缺一不可: 原子性(Atomicity):即事务是不可分割的最小工作单元,事务内的操作要么全做,要么全不做 ...

  5. 使用Guava获取某一个类的指定超类上的泛型Type T

    package com.geostar.gfstack.operationcenter.log.common.hibernate; import com.geostar.gfstack.operati ...

  6. BZOJ4653 [NOI2016] 区间 【线段树】

    题目分析: 首先思考一个二分答案的做法.我们可以注意到答案具有单调性,所以可以二分答案. 假设当前二分的答案是$ k $.那么按照大小顺序插入每个区间,同时在末端删除会对答案产生影响的区间.这里不妨用 ...

  7. 使用ROME解析rss,如何获取icon图标

    问题 网站使用SpringMVC框架,实现了RSS订阅,但是在阅读器里面,只有网站的标题,没有网站的图标. 分析 ROME会从<channel>标签下指定的<link>地址中, ...

  8. Hdoj 1789 Doing Homework again 题解

    Problem Description Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of h ...

  9. Android 性能优化提示

    原文 http://developer.android.com/guide/practices/design/performance.html 性能优化 Android应用程序运行的移动设备受限于其运 ...

  10. 【WC2018】州区划分(FWT,动态规划)

    [WC2018]州区划分(FWT,动态规划) 题面 UOJ 洛谷 题解 首先有一个暴力做法(就有\(50\)分了) 先\(O(2^nn^2)\)预处理出每个子集是否合法,然后设\(f[S]\)表示当前 ...