//Mat转QImage
QImage Widget::OpenCVMatToQImage(cv::Mat mat)
{
// 8-bits unsigned, NO. OF CHANNELS = 1
if(mat.type() == CV_8UC1)
{
QImage tempImage;
//Mat转QImage
tempImage = QImage(
static_cast<unsigned char *>(mat.data),
mat.cols,
mat.rows,
static_cast<int>(mat.step),
QImage::Format_Grayscale8
);
return tempImage;
}
// 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)
{
// 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
{
return QImage();
}
}
//设置QLabel显示图片
void Widget::setCam1ImageShow(cv::Mat src)
{
QPixmap tempMap0 = QPixmap::fromImage(OpenCVMatToQImage(src));
tempMap0 = tempMap0.scaled(
ui->Cam1Label->size(),
Qt::KeepAspectRatio,
Qt::SmoothTransformation
);
ui->Cam1Label->setPixmap(tempMap0);
}
代码可以显示完整的图片,但会带来图片放大后无法缩小的问题,只需要在初始化阶段加上这一句就可以了
ui->Cam1Label->setSizePolicy(QSizePolicy::Ignored,QSizePolicy::Ignored);
默认

缩小

这段代码演示了如何将OpenCV的Mat对象转换为QImage,并在QLabel中显示。针对图片放大后无法缩小的问题,通过设置QLabel的大小策略为Ignored,实现了图片的自适应显示。同时提供了处理单通道、三通道和四通道Mat对象转换的逻辑。
1万+

被折叠的 条评论
为什么被折叠?



