Qt5利用qcharts画图表,Mat与QImage互转,利用label显示图片等相关

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

1.怎么理解能用label标签显示和设置图片这件事情?

2.设置可滚动图片的思路?需要借助那个类?

3.Mat类型和QImage类型互相转化函数的思路,主要使用Mat转QImage?

4.怎么获取Mat类型图片的指针?

利用label标签和scrollArea滚动区域显示Mat类型图片

几个图标相关成员变量:

    ChartView *chartView;
    QChart *chart; //主类,用来显示各种Charts,调用 addSeries() 添加图表数据,调用 addAxis 、 setAxisX 或 setAxisY 配置坐标轴
    Callout *tip;
    QLineSeries *series; //管理数据点集

 

首先在设计界面拖动一个horizontalLayout布局,在布局内拖入scrollArea,然后在上面放入label标签,布局如下图:

 

 部分代码如下,注释已经很详细:

 

//在设计模式中添加的滚动区域默认为true(ui_mainwidget.h头文件中),不显示滚动条,应设置为false

ui->scrollArea->setWidgetResizable(false);//默认为true,应设置为false才显示滚动条


if (!BeamCore.CalActualDis(srcImgs[nPicIndex], pCenter, calibrateResult, dActualDis, imgShow))
	{
		cv::resize(imgShow, imgShow, cv::Size(0,0), 0.8, 3, 1);//根据需求利用opencv改变图片大小
		QImage qImg = cvMat2QImage(imgShow);//Mat转QImage
		int nQImgWidth = qImg.width();
		int nQImgHeight = qImg.height();
		QPixmap m_pixmap = QPixmap::fromImage(qImg);//label标签利用QPixmap类显示图像
		ui->scrollAreaWidgetContents->resize(nQImgWidth, nQImgHeight); //多加这一行,设置滚动区域内容与图片一致
		QPixmap fitMap = m_pixmap.scaled(nQImgWidth, nQImgHeight, Qt::KeepAspectRatio,  Qt::SmoothTransformation);//图像等比例缩放
		ui->showImgLabel->resize(QSize(nQImgWidth, nQImgHeight));//设置标签大小和图像一致
		ui->showImgLabel->setPixmap(fitMap);//显示图像

		QMessageBox::warning(NULL, "warning", QStringLiteral("不在量程范围内,请重新开始"), QMessageBox::Yes,
			QMessageBox::Yes);

		dActualDis = -1.0;//不在量程范围内,计算出错
		return dActualDis;
	}

其中Mat类型转QImage函数如下,来自(https://blog.csdn.net/liyuanbhu/article/details/46662115):

1.判断图片类型

2.设置图片的灰度级,初始化一张QImage图片

3.获取Mat类型图片的指针:uchar *pSrc = mat.data.

4.利用指针,一行行依次赋值

QImage MainWidget::cvMat2QImage(const cv::Mat mat)
{
	// 8-bits unsigned, NO. OF CHANNELS = 1
	if (mat.type() == 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;
	}
	// 8-bits unsigned, NO. OF CHANNELS = 3
	else if (mat.type() == CV_8UC3)
	{
		// 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_RGB888);
		return image.rgbSwapped();
	}
	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转Mat类型,来自(https://blog.csdn.net/liyuanbhu/article/details/46662115)::

cv::Mat QImage2cvMat(QImage image)
{
    cv::Mat mat;
    qDebug() << image.format();
    switch(image.format())
    {
    case QImage::Format_ARGB32:
    case QImage::Format_RGB32:
    case QImage::Format_ARGB32_Premultiplied:
        mat = cv::Mat(image.height(), image.width(), CV_8UC4, (void*)image.constBits(), image.bytesPerLine());
        break;
    case QImage::Format_RGB888:
        mat = cv::Mat(image.height(), image.width(), CV_8UC3, (void*)image.constBits(), image.bytesPerLine());
        cv::cvtColor(mat, mat, CV_BGR2RGB);
        break;
    case QImage::Format_Indexed8:
        mat = cv::Mat(image.height(), image.width(), CV_8UC1, (void*)image.constBits(), image.bytesPerLine());
        break;
    }
    return mat;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值