Qt QImage与OpenCV Mat转换

Qt QImage与OpenCV Mat图像转换详解
本文介绍了如何在Qt中将QImage转换为OpenCV的Mat对象,以及反之的转换方法。作者提供了测试工程的GitHub链接,并列举了四种不同的转换函数及其效果。文章提到了转换过程中需要注意的数据格式和填充字节问题,建议读者参考相关博客以了解更多细节。


本系列文章由 @yhl_leo 出品,转载请注明出处。
文章链接: http://blog.youkuaiyun.com/yhl_leo/article/details/51029382


应一个朋友的要求,整理总结一下,Qt中的图像类QImage与OpenCV库中Mat的转换方法,测试工程已发布在GitHub:yhlleo/QImage2Mat

编译环境:

  • VS2010
  • CMake (version >= 2.8.3)
  • Qt (version 4.8.6)

运行结果如图:

lena

一共有四个测试函数及其对应的转换结果:

  • qimageShow() -> QImage加载图像,并显示在Graphic Vie
### 如何在 OpenCV 的 `Mat` 和 Qt 的 `QImage` 之间进行相互转换 #### QImage 转换Mat 为了将 `QImage` 对象转换为 `cv::Mat` 类型,需要考虑颜色通道顺序以及数据类型的匹配。以下是具体实现方法: ```cpp #include <QImage> #include <opencv2/opencv.hpp> cv::Mat qImageToMat(const QImage &inImage) { cv::Mat mat; switch (inImage.format()) { case QImage::Format_RGB888: mat = cv::Mat(inImage.height(), inImage.width(), CV_8UC3, const_cast<uchar*>(inImage.bits()), inImage.bytesPerLine()).clone(); break; case QImage::Format_Grayscale8: mat = cv::Mat(inImage.height(), inImage.width(), CV_8UC1, const_cast<uchar*>(inImage.bits())).clone(); break; default: // 如果不是上述两种格式,则先转换为 RGB 格式再处理 QImage rgbImage = inImage.convertToFormat(QImage::Format_RGB888); mat = cv::Mat(rgbImage.height(), rgbImage.width(), CV_8UC3, const_cast<uchar*>(rgbImage.bits()), rgbImage.bytesPerLine()).clone(); break; } cv::cvtColor(mat, mat, cv::COLOR_BGR2RGB); // 颜色空间调整 return mat; } ``` 此段代码能够处理不同色彩模式下的图像并将其正确地映射到 OpenCV 所需的数据结构上[^1]。 #### Mat 转换QImage 当从 `cv::Mat` 向 `QImage` 进行转换时,同样需要注意像素布局差异等问题: ```cpp #include <QImage> #include <opencv2/opencv.hpp> QImage matToQImage(const cv::Mat &mat) { if(mat.type() == CV_8UC1){ // 单通道灰度图 return QImage(mat.data, mat.cols, mat.rows, static_cast<int>(mat.step), QImage::Format_Indexed8).copy(); } else if(mat.type() == CV_8UC3 || mat.type() == CV_8UC4){ // 彩色图片 BGR -> RGB cv::Mat temp; cv::cvtColor(mat, temp, cv::COLOR_BGR2RGB); if(temp.type() == CV_8UC3){ return QImage(temp.data, temp.cols, temp.rows, static_cast<int>(temp.step), QImage::Format_RGB888).copy(); }else{ return QImage(temp.data, temp.cols, temp.rows, static_cast<int>(temp.step), QImage::Format_ARGB32_Premultiplied).copy(); } } return QImage(); // 不支持的类型返回空对象 } ``` 这段代码展示了如何依据输入矩阵的颜色深度选择合适的构造方式创建对应的 `QImage` 实例,并进行了必要的颜色模型变换以适应 Qt 显示需求[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值