Mat类型转换为QImage继而实现在Label上绘制图片显示

本文介绍了如何在Qt界面中利用QLabel显示OpenCV的Mat图像。关键步骤包括将Mat转换为QImage,再转为QPixmap,通过QLabel的setPixmap方法实现显示。转换过程中涉及对单通道、三通道和四通道图像的处理,并提供了相应的代码示例。
摘要由CSDN通过智能技术生成

最近在学习使用qt和opencv在界面上显示输入的图片,发现直接Mat mat无法在ui界面上显示,成功实现的解决办法如下。
思路是:借助QLabel->setPixmap来绘制图片,首先需要将Mat类型转化为QImage类型,然后再将QImage类型转化为QPixmap类型,才可以在QLabel上画图。
下面函数可以将Mat类型转化为QImage

//图片转化
QImage MatToImage(Mat &mat)
{
	//输入图像为三通道
	if (mat.type() == CV_8UC3)
	{
		//复制输入的mat数据
		const uchar* pSrc = (const uchar*)mat.data;
		//创建与输入Mat尺寸相同的QImage
		QImage image(pSrc, mat.cols, mat.rows,(mat.cols)*3, QImage::Format_RGB888);
		//将RGB转换为BGR
		return image.rgbSwapped();
	}
	//输入图像为单通道
	else if (mat.type() == CV_8UC1)
	{
		QImage image(mat.cols, mat.rows, QImage::Format_Indexed8);
		//设置颜色表(用于将颜色索引转换为qRgb值)
		image.setColorCount(256);//灰度级数256
		for (int i = 0; i < 256; i++)
		{
			image.setColor(i, qRgb(i, i, i));
		}
		//复制输入
		uchar *pSrc = mat.data;
		for (int row = 0; row < mat.rows; row++)
		{
			uchar *pDest = image.scanLine(row);//对图像的一行进行扫描,获取本行中个像素的内存地址
											   //复制src的内存的前num个字节内容给dest
			memcpy(pDest, pSrc, mat.cols);
			pSrc += mat.step;
		}
		return image;
	}
	//输入图像为四通道
	else if (mat.type() == CV_8UC4)
	{
		qDebug() << "CV_8UC4";
		// Copy input Mat
		const uchar *pSrc = (const uchar*)mat.data;
		// Create QImage with same dimensions as input Mat
		QImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_ARGB32);
		return image.copy();
	}
	else
	{
		qDebug() << "ERROR:Mat could not be converted to QImage";
		return QImage();

	}

}

只有单通道、三通道和四通道可以转化为QImage类型,其他类型的图片无法进行转换。返回值类型是QImage。
下面将QImage转换为QPixmap,借助QLabel显示

QPixmap pix;
pix = QPixmap::fromImage(pix.scaled(ui->label->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation));
ui->label->setPixmap(pix);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值