前言

Mat是opencv中的存储图像的容器,也是图像像素矩阵

QImage是Qt中存储图片常用的类

Qt和opencv经常配合在一起使用,但Qt的函数方法的参数是不接受Mat的,所以如果我们想要在Qt中操作opencv处理后的图像,就必须将Mat转换成QImage

Mat->QImage

Mat转换成QImage,可直接使用QImage的构造函数进行转换,但要注意的是,当Mat类型是CV_8UC3时,因为opencv色彩空间是BGR,Qt默认是RGB,所以需要转换,可以使用opencv中的cvtColor函数或者Qt中的rgbSwapped来进行转换,注意在QImage的生存周期内,必须保证Mat中的数据不会被释放,否则QImage就会失效

解决方法:调用QImage::bits函数复制一份Mat数据,这样Mat释放,QImage也能正常使用

QImage MainWindow::MatToImage(Mat &m) //Mat转QImage
{//判断m的类型,可能是CV_8UC1  CV_8UC2  CV_8UC3  CV_8UC4switch(m.type()){ //QIamge 构造函数, ((const uchar *data, 宽(列),高(行), 一行共多少个(字节)通道,宽度*字节数,宏参数)case CV_8UC1:{QImage img((uchar *)m.data,m.cols,m.rows,m.cols * 1,QImage::Format_Grayscale8);return img;}break;case CV_8UC3:   //一个像素点由三个字节组成{//cvtColor(m,m,COLOR_BGR2RGB); BGR转RGBQImage img((uchar *)m.data,m.cols,m.rows,m.cols * 3,QImage::Format_RGB888);return img.rgbSwapped(); //opencv是BGR  Qt默认是RGB  所以RGB顺序转换}break;case CV_8UC4:{QImage img((uchar *)m.data,m.cols,m.rows,m.cols * 4,QImage::Format_RGBA8888);return img;}break;default:{QImage img; //如果遇到一个图片均不属于这三种,返回一个空的图片return img;}}
}

QImage->Mat

QImage转换Mat,可直接使用Mat的构造函数进行转换,通过QImage提供的format函数判断图片类型,分别case不同情况,注意,图片类型远不止这些,这里只是列举常见的灰度图和彩色图类型

Mat MainWindow::ImageToMat(QImage &image) //QImage转Mat
{Mat mat = Mat::zeros(image.height(), image.width(),image.format()); //初始化Matswitch(image.format()) //判断image的类型{case QImage::QImage::Format_Grayscale8:  //灰度图mat = Mat(image.height(), image.width(),CV_8UC1,(void*)image.constBits(),image.bytesPerLine());break;case QImage::Format_RGB888: //3通道彩色mat = Mat(image.height(), image.width(),CV_8UC3,(void*)image.constBits(),image.bytesPerLine());break;case QImage::Format_ARGB32: //4通道彩色mat = Mat(image.height(), image.width(),CV_8UC4,(void*)image.constBits(),image.bytesPerLine());break;default:return mat;}return mat;
}

这篇文章对你有帮助的话就点个赞吧~

点赞收藏关注就是对我最大的支持~

Mat与QImage互相转换相关推荐

  1. opencv常用函数,QT中Mat与QImage的转换

    一.opencv简介 opencv是一个跨平台计算机视觉和机器学习软件库,可以运行在Linux.Windows.Android和Mac OS操作系统上,实现了图像处理和计算机视觉方面的很多通用算法. ...

  2. opencv将图像处理之后显示在label上(Mat转化为qimage)转换之后label显示全黑

    opencv将图像处理之后显示在label上(Mat转化为qimage)转换之后label显示全黑 1.本实验要完成的功能:利用opencv将原图像灰度处理,然后显示在label上 2.图像处理程序: ...

  3. [视觉实战案例]Qt下BYTE、QImage、HObject、Mat等图像格式的转换和图像显示方法

    文章目录 一.图像格式间相互转换 1.BYTE转QImage.HObject和Mat 2.QImage.HObject和Mat的相互转换 二.图像显示方法 1.QLabel显示QPixmap图像 2. ...

  4. QImage转Mat(Mat 转QImage)工具类

    @[TOC](QImage转Mat(Mat 转QImage)工具类) 注意QImage转Mat 需要mat.clone() matcvImage.h #ifndef MATCVTIMAGE_H #de ...

  5. Java中BufferImage与Mat格式的互相转换

    初学OpenCV,在项目中需要对图像进行插值放大处理,然后再做一系列操作,但是OpenCV中插值放大处理的输入和输出都是Mat矩阵格式的数组,而项目需要BufferImage类型的图像数据,OpenC ...

  6. CNN推理时opencv图像Mat数组从HWC转换到CHW方法

    在嵌入式端进行CNN推理时,opencv中Mat数组数据组织格式为HWC,输入到推理框架中,需要转换为CHW格式,可以使用opencv中dnn模块的cv::dnn::blobFromImages或cv ...

  7. mat 转 Qimage

    QImage FitnessMainDlg::MatImageToQt(const cv::Mat &src) {//CV_8UC1 8位无符号的单通道---灰度图片if (src.type( ...

  8. opencv颜色识别学习总结

    将OpenCV 用于识别彩色LED颜色 将OpenCV 用于识别彩色LED颜色时,可以通过分色计算各通道非饱和像素的HSV值,能可靠识别各LED的颜色. 使用python编程,识别一个1024*480 ...

  9. image转pixmap qt_Qt 编程指南10 QImage Mat QPixmap转换

    //示例 pushButtonOpenPicBig按钮clicked单击动作触发 void Qt_Window::on_pushButtonOpenPicBig_clicked() { string ...

最新文章

  1. 从零到熟练编写LaTex数学公式,这两篇就够了
  2. 编译安装openresty+mariadb+php7
  3. Enterprise Library 5.0发布
  4. It Smells!不要让两个状态纠缠的类同时成为某个事件的观察者(一切都只是视图)...
  5. nodejs返回下载文档,文档名称出现汉字出现乱码解决
  6. Hibernate sqlserver 的对象转成 Hibernate mysql 的对象时 需注意
  7. windows下安装phpcms html/ 文件夹不可写的一种错误以及解决方法
  8. design短语的用法总结_中考英语常考的重点句型及短语汇总,考前必备
  9. 【路径规划】基于matalb遗传算法机器人栅格地图路径规划【含Matlab源码 175期】
  10. linux shell捕获异常,shell脚本中如何获取错误输出
  11. 做Java软件开发有前途吗?
  12. 楚留香服务器维护时间,【9月28日维护公告】
  13. Multisim 电路辅助设计思维导图
  14. 瞬态抑制二极管型号参数对照表,想要的都在这里
  15. linux磁盘配额分区,Linux磁盘配额
  16. 从模型制作(3dmax)到网页显示(babylonjs)全过程介绍
  17. android sdk 配置出错error: unknown argument --licenses
  18. CAD高版本窗体阵列LISP_CAD高版本窗体阵列LISP_AutoCAD高版本怎么把阵列对话框调出来?...
  19. emoji表情无法显示在html,微信分享页面Andriod手机emoji表情符无法显示问题?
  20. 在visio中不借助公式编辑器在字母上方打波浪线

热门文章

  1. 史记翻译-汉初三杰-萧何-萧相国世家第二十三
  2. React+SpringBoot通过WebSocket实时统计在线人数
  3. 实现Log4j和Logback的统一日志封装与动态日志级别调整
  4. opencv学习18——浮雕效果
  5. Cisco Packet Tracer 思科模拟器利用NAT实现外网主机访问内网服务器
  6. UI设计中分享功能总结
  7. mockmvc技术分享
  8. 复制一个虚拟化的自己:数字孪生将如何影响我们的生活?
  9. java object.getclass_Java Object类,getClass()方法介绍
  10. android 弹出框崩溃_Android处理崩溃的一些实践