OpenCV学习(2)--cv::Mat转化为QImage

本文旨在介绍如何将OpenCV的cv::Mat图像数据转换为Qt中的QImage格式,以便在Qt界面中显示。内容涵盖转换的目的、基本原理及详细代码实现。

 一.目的

   在使用Qt和OpenCV写程序的时候,有时候需要使用OpenCV进行处理,然后使用Qt显示出来,因此,有必要考虑将如何将cv::Mat类型转换为QImage类型。


二.原理

   网上主流的做法是使用QImage的构造函数进行转换,主要是使用cv::Mat的data来构造一个QImage类型,这样做确实可以达到转换目的,但是,因此这样构造出来的QImage本身并不保存data,因此,在QImage的生存周期内,必须保证cv::Mat中的数据不会被释放。上面的这个问题也是比较容易解决的,主要是通过调用QImage::bits函数来强制QImage进行深层次复制,使得QImage自己保存一份data的副本,这样就可以保证在cv::Mat中的数据被释放的时候,QImage还能正常使用。



### 将QImagecv::Mat相互换 #### 从QImagecv::Mat换 当将`QImage`对象换为`cv::Mat`时,需要注意两者之间的颜色空间差异。由于`QImage`默认采用RGB格式,而OpenCV则常用BGR格式,在换过程中需调整颜色通道顺序。 ```cpp #include <opencv2/opencv.hpp> #include <QImage> cv::Mat qimageToCvMat(const QImage &inImage) { // 确保输入图像是有效的 if (inImage.isNull()) return cv::Mat(); // 创建一个临时副本并为ARGB32格式以便于处理 QImage image = inImage.convertToFormat(QImage::Format_ARGB32); // 获取图像尺寸信息 int width = image.width(); int height = image.height(); // 定义输出矩阵大小和类型 cv::Mat outMat(height, width, CV_8UC4, (void*)image.bits(), image.bytesPerLine()); // 如果需要的话可以改变色彩模式(这里假设目标是BGR) cv::cvtColor(outMat, outMat, cv::COLOR_RGBA2BGR); return outMat; } ``` 此方法通过创建一个新的`cv::Mat`实例来接收来自`QImage`的数据,并利用`convertToFormat()`确保源图片处于适合操作的状态[^2]。 #### 从cv::MatQImage换 对于相反方向上的换——即由`cv::Mat`至`QImage`,同样要考虑颜色模型的不同: ```cpp #include <opencv2/opencv.hpp> #include <QImage> QImage cvMatToQImage(const cv::Mat &inMat) { switch (inMat.type()) { case CV_8UC1: { // 单通道灰度图像 QImage img(inMat.data, inMat.cols, inMat.rows, static_cast<int>(inMat.step), QImage::Format_Grayscale8); return img.copy(); } case CV_8UC3: { // BGR彩色图像 cv::Mat rgb; cv::cvtColor(inMat, rgb, cv::COLOR_BGR2RGB); // 换颜色空间 QImage img(rgb.data, rgb.cols, rgb.rows, static_cast<int>(rgb.step), QImage::Format_RGB888); return img.copy(); } default: qDebug() << "Unsupported format"; break; } return QImage(); } ``` 上述实现中包含了两种常见情况下的处理逻辑:单通道灰度图以及三通道彩图。对于后者而言,先执行一次颜色变换以匹配Qt所期望的颜色布局再构建相应的`QImage`对象[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值