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

利用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):

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;
}

猜你喜欢

转载自blog.csdn.net/vict_wang/article/details/81173570