把cv::Mat转化为QImage

来源:互联网 发布:zuk 系统升级软件 编辑:程序博客网 时间:2024/05/21 06:47

前一篇博客《把QImage转换为cv::Mat》介绍了像素在QImage和Mat里面不同的存储方式,以及如何实现从QImage到Mat的转换。了解了存储像素的机理之后,从Mat向QImage的转化也不难。Qimage的构造函数有很多种,其中一种构造函数的使用方法与我们在上一篇《把QImage转换为cv::Mat》Mat的构造方法相似:在构造时,都要告知构造函数,图像的每行有几个字节(bytesPerLine变量),这样就避免了字节错位的问题:


在上一篇博客的示例代码的基础上,我有添加了函数QImage MatToQImage(cv::Mat),实现从cv::Mat到QImage的转换:

QImageMatToQImage(cv::Mat mtx){switch (mtx.type()){case CV_8UC1:{QImage img((const unsigned char *)(mtx.data), mtx.cols, mtx.rows, mtx.cols, QImage::Format_Grayscale8); return img;}break;case CV_8UC3:{QImage img((const unsigned char *)(mtx.data), mtx.cols, mtx.rows, mtx.cols * 3, QImage::Format_RGB888); return img.rgbSwapped();}break;case CV_8UC4:{QImage img((const unsigned char *)(mtx.data), mtx.cols, mtx.rows, mtx.cols * 4, QImage::Format_ARGB32); return img;}break;default:{QImage img;return img;}break;}}

并且在WheelEvent()事件中对函数做了测试。测试了灰度图CV_8UC1和彩图CV_8UC3两种情况,均正常。CV_8UC4的情况下,颜色显示有问题,还在查问题。

#include "mat_qimage.h"#include "cvUtility.h"//#define GRAYconst int iWidth = 250, iHeight = 255;unsigned char * m_pData = new unsigned char[iWidth * iHeight];QImage m_Img;Mat_QImage::Mat_QImage(QWidget *parent): QMainWindow(parent){ui.setupUi(this);#if defined(GRAY)for(int k = 0; k<iWidth;k++){for(int l = 0; l<iHeight; l++){m_pData[l * iWidth + k] = k;}}QImage img(m_pData, iWidth, iHeight, iWidth, QImage::Format_Grayscale8);qDebug()<<img.bytesPerLine();m_Img = QImage(iWidth, iHeight, QImage::Format_Grayscale8);#elseQImage img;img.load(QString("E:\\merge.bmp"));m_Img = QImage(iWidth, iHeight, img.format());#endifQPainter qp;qp.begin(&m_Img);qp.drawImage(m_Img.rect(), img, img.rect());qp.end();}Mat_QImage::~Mat_QImage(){if(m_pData)delete [] m_pData;}void Mat_QImage::paintEvent(QPaintEvent *e){QPainter qp;qp.begin(this);qp.drawImage(rect(), m_Img, m_Img.rect());qp.end();}void Mat_QImage::mouseDoubleClickEvent(QMouseEvent *e){cv::Mat mtx = QImageToMat(m_Img);bool b = cv::imwrite("E:\\mtx.jpg", mtx);qDebug()<<b;}void Mat_QImage::wheelEvent(QWheelEvent *e){#if defined(GRAY)cv::Mat mtx(iHeight, iWidth, CV_8UC1, m_pData);cv::imwrite("E:\\raw_mtx.jpg", mtx);m_Img = MatToQImage(mtx);update();m_Img.save("E:\\qimg.jpg");#elsecv::Mat mtx = cv::imread("E:\\merge.bmp");cv::Mat dst;cv::resize(mtx, dst, cv::Size(iWidth, iHeight));cv::imwrite("E:\\raw_mtx.jpg", dst);m_Img = MatToQImage(dst);update();m_Img.save("E:\\qimg.jpg");#endif}



0 0