博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
QT QImage、QPixmap与Opencv 中的Mat相互转化
阅读量:3729 次
发布时间:2019-05-22

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

简述

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

代码

#include 
#include
#include
#include "opencv2/opencv.hpp"// 将Mat转化位QImageQImage 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转化为QPixmapQPixmap cvMatToQPixmap( const cv::Mat &inMat ){ return QPixmap::fromImage( cvMatToQImage( inMat ) );}//将QImage转化为Matcv::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转化为Matcv::Mat QPixmapToCvMat( const QPixmap &inPixmap, bool inCloneImageData = true ){ return QImageToCvMat( inPixmap.toImage(), inCloneImageData );}

亲测可用!

参考博客:

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

你可能感兴趣的文章
Map练习之根据value获取key
查看>>
Map练习之斗地主无序发牌
查看>>
Map练习之斗地主发牌有序
查看>>
IO小练习之递归删除文件
查看>>
IO小练习之统计文件夹下各种不同类型的文件个数
查看>>
IO练习之拷贝文件夹
查看>>
IO练习之打印当前文件夹下大于20M的后缀名是.txt的文件的绝对路径
查看>>
IO练习之统计单词数并写入文件
查看>>
多线程练习之模拟上车过程并在控制台打印
查看>>
多线程练习之开启3个线程,输出奇数的时将线程名打印
查看>>
IO重点总结
查看>>
hbase shell命令行下backspace键无效解决办法
查看>>
HBase概述安装及操作
查看>>
Maven详解
查看>>
Mybatis详解
查看>>
Spring整合Mybatis
查看>>
Spring概述
查看>>
Spring IOC&DI
查看>>
Spring AOP
查看>>
静态代理&动态代理
查看>>