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