把cv::Mat转化为QImage

12 篇文章 1 订阅
10 篇文章 0 订阅

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


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

QImage			MatToQImage(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 GRAY

const 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);
#else
	QImage img;
	img.load(QString("E:\\merge.bmp"));
	m_Img = QImage(iWidth, iHeight, img.format());
#endif
	QPainter 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");
#else
	cv::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
}



  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值