博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
QT中的QImage、QPixmap和opencv 中的mat转化
阅读量:1886 次
发布时间:2019-04-26

本文共 4010 字,大约阅读时间需要 13 分钟。

我们使用QT和opencv的过程中经常会碰到这样的问题:Mat怎么转化位QImage?Mat怎么转化为QPixmap?今天我来告诉大家一个比较好的解决方案(以下代码参考了别人的,增加了一些修改)

#include 
#include
#include
#include "opencv2/imgproc/imgproc.hpp"#include "opencv2/imgproc/types_c.h"namespace CVS {
// 将Mat转化位QImageinline QImage cvMatToQImage( const cv::Mat &inMat ){
switch ( inMat.type() ) {
// 8-bit, 4 channel case CV_8UC4: {
QImage image( inMat.data, inMat.cols, inMat.rows, static_cast
(inMat.step), QImage::Format_ARGB32 ); return image; } // 8-bit, 3 channel case CV_8UC3: {
QImage image( inMat.data, inMat.cols, inMat.rows, static_cast
(inMat.step), QImage::Format_RGB888 ); return image.rgbSwapped(); } // 8-bit, 1 channel case CV_8UC1: {
#if QT_VERSION >= QT_VERSION_CHECK(5, 5, 0) QImage image( inMat.data, inMat.cols, inMat.rows, static_cast
(inMat.step), QImage::Format_Grayscale8 );//Format_Alpha8 and Format_Grayscale8 were added in Qt 5.5#else//这里还有一种写法,最后给出 static QVector
sColorTable; // only create our color table the first time if ( sColorTable.isEmpty() ) { sColorTable.resize( 256 ); for ( int i = 0; i < 256; ++i ) { sColorTable[i] = qRgb( i, i, i ); } } QImage image( inMat.data, inMat.cols, inMat.rows, static_cast
(inMat.step), QImage::Format_Indexed8 ); image.setColorTable( sColorTable );#endif return image; } default: qWarning() << "CVS::cvMatToQImage() - cv::Mat image type not handled in switch:" << inMat.type(); break; } return QImage();}//将Mat转化为QPixmapinline QPixmap cvMatToQPixmap( const cv::Mat &inMat ){ return QPixmap::fromImage( cvMatToQImage( inMat ) );}//将QImage转化为Matinline cv::Mat QImageToCvMat( const QImage &inImage, bool inCloneImageData = true ){ switch ( inImage.format() ) { // 8-bit, 4 channel case QImage::Format_ARGB32: case QImage::Format_ARGB32_Premultiplied: { cv::Mat mat( inImage.height(), inImage.width(), CV_8UC4, const_cast
(inImage.bits()), static_cast
(inImage.bytesPerLine()) ); return (inCloneImageData ? mat.clone() : mat); } // 8-bit, 3 channel case QImage::Format_RGB32: case QImage::Format_RGB888: { if ( !inCloneImageData ) { qWarning() << "CVS::QImageToCvMat() - Conversion requires cloning because we use a temporary QImage"; } QImage swapped = inImage; if ( inImage.format() == QImage::Format_RGB32 ) { swapped = swapped.convertToFormat( QImage::Format_RGB888 ); } swapped = swapped.rgbSwapped(); return cv::Mat( swapped.height(), swapped.width(), CV_8UC3, const_cast
(swapped.bits()), static_cast
(swapped.bytesPerLine()) ).clone(); } // 8-bit, 1 channel case QImage::Format_Indexed8: { cv::Mat mat( inImage.height(), inImage.width(), CV_8UC1, const_cast
(inImage.bits()), static_cast
(inImage.bytesPerLine()) ); return (inCloneImageData ? mat.clone() : mat); } default: qWarning() << "CVS::QImageToCvMat() - QImage format not handled in switch:" << inImage.format(); break; } return cv::Mat();}//将QPixmap转化为Matinline cv::Mat QPixmapToCvMat( const QPixmap &inPixmap, bool inCloneImageData = true ){ return QImageToCvMat( inPixmap.toImage(), inCloneImageData );}}
//CV_8UC1另一种写法,不过我觉得上面的一种写法更优雅^_^QImage image(mat.cols, mat.rows, QImage::Format_Indexed8);  // Set the color table (used to translate colour indexes to qRgb values)  image.setColorCount(256);  for(int i = 0; i < 256; i++)  {
image.setColor(i, qRgb(i, i, i)); } // Copy input Mat uchar *pSrc = mat.data; for(int row = 0; row < mat.rows; row ++) {
uchar *pDest = image.scanLine(row); memcpy(pDest, pSrc, mat.cols); pSrc += mat.step; } return image;

新建一个头文件,将代码(CV_8UC1你自己挑一个吧)添加进去。

如何调用函数?在你要调函数的.cpp文件中添加using namespace CVS;即可。我推荐你这样去做CVS::函数

转载地址:http://qqkdf.baihongyu.com/

你可能感兴趣的文章
我的Java后端书架 (2016年暖冬4.0版)
查看>>
每个程序员都必读的10篇文章
查看>>
也谈IO模型
查看>>
谈谈互联网后端基础设施
查看>>
Mybatis的ResultMap的使用
查看>>
Java 异常处理的误区和经验总结
查看>>
Chrome控制台使用详解
查看>>
Chrome 控制台console的用法(学了之后对于调试js可是大大有用的哦)
查看>>
15 个必须知道的 Chrome 开发工具技巧
查看>>
推荐的四款产品原型设计工具
查看>>
Spring基础知识汇总 Java开发必看
查看>>
设计模式(一)工厂模式Factory(创建型)
查看>>
Spring - Java/J2EE Application Framework 应用框架
查看>>
Spring - Java/J2EE Application Framework 应用框架 第 1 章 简介
查看>>
Spring - Java/J2EE Application Framework 应用框架 第 3 章 Beans, BeanFactory和ApplicationContext
查看>>
Spring - Java/J2EE Application Framework 应用框架 第 4 章 属性编辑器,数据绑定,校验与BeanWeapper(Bean封装)
查看>>
Spring - Java/J2EE Application Framework 应用框架 第 7 章 事务管理
查看>>
给Java程序猿们推荐一些值得一看的好书
查看>>
JavaScript之数据类型
查看>>
MemCache超详细解读
查看>>