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

  1. //##### cv::Mat ---> QImage #####
  2.  
  3. // Shallow copy
  4. QImage mat2qimage_ref(cv::Mat &m, QImage::Format format) {
  5. return QImage(m.data, m.cols, m.rows, m.step, format);
  6. }
  7.  
  8. // Deep copy
  9. QImage mat2qimage_cpy(cv::Mat &m, QImage::Format format) {
  10. return QImage(m.data, m.cols, m.rows, m.step, format).copy();
  11. }
  12.  
  13. //##### QImage ---> cv::Mat #####
  14.  
  15. // Shallow copy
  16. cv::Mat qimage2mat_ref(QImage &img, int format) {
  17. return cv::Mat(img.height(), img.width(), format, img.bits(), img.bytesPerLine());
  18. }
  19.  
  20. // Deep copy
  21. cv::Mat qimage2mat_ref(QImage &img, int format) {
  22. return cv::Mat(img.height(), img.width(), format, const_cast<uchar*>(img.bits()), img.bytesPerLine()).clone();
  23. }

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

  1. //##### cv::Mat ---> QImage #####
  2. QImage cvMat_to_QImage(const cv::Mat &mat ) {
  3. switch ( mat.type() )
  4. {
  5. // 8-bit, 4 channel
  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-bit, 3 channel
  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-bit, 1 channel
  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.  
  41. //##### QImage ---> cv::Mat #####
  42. cv::Mat QImage_to_cvMat( const QImage &image, bool inCloneImageData = true ) {
  43. switch ( image.format() )
  44. {
  45. // 8-bit, 4 channel
  46. case QImage::Format_RGB32:
  47. {
  48. cv::Mat mat( image.height(), image.width(), CV_8UC4, const_cast<uchar*>(image.bits()), image.bytesPerLine() );
  49. return (inCloneImageData ? mat.clone() : mat);
  50. }
  51.  
  52. // 8-bit, 3 channel
  53. case QImage::Format_RGB888:
  54. {
  55. if ( !inCloneImageData ) {
  56. qWarning() << "ASM::QImageToCvMat() - Conversion requires cloning since we use a temporary QImage";
  57. }
  58. QImage swapped = image.rgbSwapped();
  59. return cv::Mat( swapped.height(), swapped.width(), CV_8UC3, const_cast<uchar*>(swapped.bits()), swapped.bytesPerLine() ).clone();
  60. }
  61.  
  62. // 8-bit, 1 channel
  63. case QImage::Format_Indexed8:
  64. {
  65. cv::Mat mat( image.height(), image.width(), CV_8UC1, const_cast<uchar*>(image.bits()), image.bytesPerLine() );
  66.  
  67. return (inCloneImageData ? mat.clone() : mat);
  68. }
  69.  
  70. default:
  71. qDebug("Image format is not supported: depth=%d and %d format\n", image.depth(), image.format());
  72. break;
  73. }
  74.  
  75. return cv::Mat();
  76. }

Convert between cv::Mat and QImage 两种图片类转换的更多相关文章

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

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

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

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

  3. OpenCV IplImage FlyCapture2 Image Conversion 两种图像类的相互转化

    OpenCV的IplImag和 FlyCapture2 的 Image是两种常见的图片格式,在实际的应用中,我们通常要混合使用OpenCV和FlyCapture2这两个SDK,所以这两种图片格式之间的 ...

  4. WPF 下两种图片合成或加水印的方式(转载)

    来源:http://www.cnblogs.com/lxblog/ 最近项目中应用多次应用了图片合成,为了今后方便特此记下. 在WPF下有两种图片合成的方式,一种还是用原来C#提供的GDI+方式,命名 ...

  5. 两种图片延迟加载的方法总结jquery.scrollLoading.js与jquery.lazyload.js

    估计网上能查到的最多的两种图片延迟加载方法就是jquery.scrollLoading.js与jquery.lazyload.js了,其中jquery.lazyload.js的调用方法因为有网友爆出的 ...

  6. iOS:图片上传时两种图片压缩方式的比较

    上传图片不全面的想法:把图片保存到本地,然后把图片的路径上传到服务器,最后又由服务器把路径返回,这种方式不具有扩展性,如果用户换了手机,那么新手机的沙盒中就没有服务器返回的图片路径了,此时就无法获取之 ...

  7. 原生js - 两种图片懒加载实现原理

    目前图片懒加载的方式主要有两种: 1.利用getBoundingClientRectAPI得到当前元素与视窗的距离来判断 2.利用h5的新API IntersectionObserver 来实现 ge ...

  8. 09 Python两种创建类的方式

    第一种比较普遍的方式: class Work(): def __init__(self,name): self.name = name w = Work('well woker') 这样就简单创建了一 ...

  9. 两种图片延迟加载的方法总结jquery.scrollLoading.js与jquery.lazyload.js---转载

    jquery.scrollLoading方法 html <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml& ...

随机推荐

  1. ML 06、感知机

    机器学习算法 原理.实现与实践  —— 感知机 感知机(perceptron)是二分类的线性分类模型,输入为特征向量,输出为实例的类别,取值+1和-1.感知机学习旨在求出将训练数据进行线性划分的分离超 ...

  2. 遍历进程活动链表(ActiveProcessLinks)、DKOM隐藏进程

    1.EPROCESS结构体 EPROCESS块来表示.EPROCESS块中不仅包含了进程相关了很多信息,还有很多指向其他相关结构数据结构的指针.例如每一个进程里面都至少有一个ETHREAD块表示的线程 ...

  3. AES128和AES256主要区别和安全程度是多少?他们对于机器的消耗是怎样的?两者性能如何?实际开发如何选择?

    高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DES, ...

  4. session应用----登录验证小案例

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...

  5. 解决mysql shell执行中文表名报command not found错误

    mysql -h 192.168.22.201 -uusername -ppassword --default-character-set=utf8 rom3 -e "DELETE FROM ...

  6. css3 -- 过渡与动画

    1.注意使用前缀 2.属性: transition-property:none/all/属性 3.持续时间: transition-duration:默认值是0,即使是负值,按照0进行处理 4.tra ...

  7. jquery(ajax)与js(ajax)的比较

    原始js: function update_mess(){ var account_name = $("#account").val(); var xmlhttp; if(wind ...

  8. http://www.roncoo.com/course/view/a09d8badbce04bd380f56034f8e68be0

    http://www.roncoo.com/course/view/a09d8badbce04bd380f56034f8e68be0

  9. Flume interceptor 使用注意事项

    1. 在使用 Regex Filtering Interceptor的时候一个属性是excludeEvents 当它的值为true 的时候,过滤掉匹配到当前正则表达式的一行 当它的值为false的时候 ...

  10. ashx 文件 与js文件数据交互

    //js代码 //城市下拉列表             $("#selPro").change(function() {                 var option = ...