【QT】QT从零入门教程(十五):QImage和Mat的转换
QT处理图像用的是QImage类,而OpenCV处理图像则是使用cv::Mat类,如果要在QT中运用OpenCV,那就需要进行QImage和Mat的相互转换。
// cv::Mat转换成QImage
QImage cvMat2QImage(const Mat& mat)
{if (mat.type() == CV_8UC1) // 单通道{QImage image(mat.cols, mat.rows, QImage::Format_Indexed8);image.setColorCount(256); // 灰度级数256for (int i = 0; i < 256; i++){image.setColor(i, qRgb(i, i, i));}uchar *pSrc = mat.data; // 复制mat数据for (int row = 0; row < mat.rows; row++){uchar *pDest = image.scanLine(row);memcpy(pDest, pSrc, mat.cols);pSrc += mat.step;}return image;}else if (mat.type() == CV_8UC3) // 3通道{const uchar *pSrc = (const uchar*)mat.data; // 复制像素QImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_RGB888); // R, G, B 对应 0,1,2return image.rgbSwapped(); // rgbSwapped是为了显示效果色彩好一些。}else if (mat.type() == CV_8UC4) // 4通道{const uchar *pSrc = (const uchar*)mat.data; // 复制像素QImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_ARGB32); // B,G,R,A 对应 0,1,2,3return image.copy();}else{return QImage();}
}
// QImage转换成cv::Mat
Mat QImage2cvMat(QImage image)
{Mat mat;switch (image.format()){case QImage::Format_ARGB32:case QImage::Format_RGB32:case QImage::Format_ARGB32_Premultiplied:mat = Mat(image.height(), image.width(), CV_8UC4, (void*)image.constBits(), image.bytesPerLine());break;case QImage::Format_RGB888:mat = Mat(image.height(), image.width(), CV_8UC3, (void*)image.constBits(), image.bytesPerLine());cv::cvtColor(mat, mat, CV_BGR2RGB);break;case QImage::Format_Indexed8:mat = Mat(image.height(), image.width(), CV_8UC1, (void*)image.constBits(), image.bytesPerLine());break;}return mat;
}
【QT】QT从零入门教程(十五):QImage和Mat的转换相关推荐
- 【QT】QT从零入门教程(十六):QSS样式表
实现一个软件的基本界面和功能后,接下来要做的就是美化界面,这就用到了QSS样式表. QSS包含了一个样式规则序列,一个样式规则由一个选择器和声明组成,选择器指定哪些部件由规则影响,声明指定哪些 ...
- 【QT】QT从零入门教程(十四):标准颜色对话框类QColorDialog
Qt中提供了一些标准的对话框,用于实现一些常用的预定义功能,本节要讲的是颜色对话框QColorDialog,它是在标准文件对话框的基础之上添加一些布局实现的. 测试程序: QColor color ...
- 【QT】QT从零入门教程(十二):实现工具箱QButtonGroup
工具箱有两种实现方式,一是运用工具栏QToolBar,二是运用QButtonGroup,在按钮组内创建多个QPushButton,每个按钮对应不同的槽函数. 本节的"工具箱" ...
- 【QT】QT从零入门教程(十):QT布局管理QLayout
介绍完常用控件之后,我们发现,之前控件的大小位置都是通过resize().move()来设置的,很不方便,当你修改某个控件的位置时,其他控件也需要进行调整,容易出现牵一发而动全身的情况. QT ...
- SpringBoot入门教程(十五)集成Druid
Druid是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0.DBCP.PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生的DB ...
- ExtJs 入门教程十五[列模型 :ColumnModel]
一.效果 二.代码 var fwzcm= new Ext.grid.ColumnModel([new Ext.grid.RowNumberer(),new Ext.grid.CheckboxSelec ...
- 【Visual C++】游戏开发笔记四十七 浅墨DirectX教程十五 翱翔于三维世界 摄像机的实现
分享一下我老师大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow 本系列文章由zhm ...
- [Python从零到壹] 十五.文本挖掘之数据预处理、Jieba工具和文本聚类万字详解
欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...
- 【Visual C++】游戏开发笔记四十七 浅墨DirectX教程十五 翱翔于三维世界:摄像机的实现...
本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接:http://blog.csdn.net/zhmxy555/article/details/8657656 作者:毛星云(浅墨) ...
最新文章
- docker 安装oracle_阿里云使用Docker搭建Hadoop集群
- 在Asp.Net中从sqlserver检索(retrieve)图片
- shell脚本实现动态时钟
- 洛谷——P1019 单词接龙
- java仿qq空间音乐播放_完美实现仿QQ空间评论回复特效
- python数组元素复制_python的numpy数组 的复制问题?
- webshell提权教程linux,Linux下WEBSHELL提权
- 在Linux下编写C++程序,使用gcc编译c++出错
- 编译Nginx提示gzip module requires the zlib library
- js与java对json的操作
- 坐标转换工具类:84坐标系,火星坐标系,与百度坐标系之间的互相转换
- python视频教程全集免费-Python免费视频教程
- mysql中ddl是什么_MySQL中DDL是什么意思
- C#实现多人语音聊天
- Excel VBA 编程的常用代码
- php转调页面,如何转调
- SpringBoot+vue实现前后端分离的简历系统
- 数据结构之手斯红黑树
- vue.js:父组件和子组件
- 【毕业设计】65-基于单片机的智能抢答器系统设计(原理图工程+仿真工程+源代码+答辩论文+visio流程图+实物图)
热门文章
- 由于找不到appvisvsubsystems32.dll_老实人就别找女朋友了 跟个老实人结婚有多累_新闻资讯...
- html让文本框左剧中对齐_HTML 样式 CSS
- 数据结构 6-0 图
- 【MatConvNet】配置GPU
- 数据结构实验 2.连续整数之和(2012年北航研究生入学考试)
- [转]邵雍其诗、其人、其事
- c/c++教程 - 2.4.2.3~4 拷贝构造函数的调用时机,构造函数调用规则
- 小技巧 ----- 计数数组中小于 target 的元素个数
- PASCAL-VOC2012 数据集介绍 及 制作同格式数据
- nvidia-smi 显示无进程,但GPU显存被占用