问题描述:
环境:win7 + QT5.9.8 + Opencv3.4.2
用QT开发一个GUI界面。在界面上有一个label用于显示图像。
一个slider,当拖动slider的滑块时缩放图像,缩放后的图像在label上显示。
图像的缩放分别采用OpecnCV中的 cv::resize() 和 QT的QPixmap::scaled()实现。
经测试发现两种方法都可实现缩放,但是显示的时候出现了不同的变现:
1) 通过OpecnCV中的 cv::resize()缩放后,将缩放后的图像通过label->setPixmap()时出错。
一般连续缩放几次后,程序崩溃。错误信息如下:
Error - RtlWerpReportException failed with status code :-1073741823. Will try to launch the process directly
16:43:38: 程序异常结束。
2)而通过QT的QPixmap::scaled()缩放后,将缩放后的图像通过label->setPixmap()显示一切正常。
代码片段:
slider 滑块拖动的槽函数
void MainWindow::on_slider_valueChanged(int val)
{
Mat mat_src //需要缩放的输入图像,通过文件或视频帧,获取过程略
const QPixmap pix_src = cvMat2QPixmap(mat_src); //原始图像Mat转Pixmap
#ifdef Scale_byMat
Mat mat_dest;
//通过Opencv缩放图像
cv::resize(mat_src, mat_dest, Size(mat_src.cols*val/10, mat_src.rows*val/10),0, 0, INTER_NEAREST);
QPixmap pix_dest = cvMat2QPixmap(mat_dest); //缩放后的Mat图像转QPixmap
#endif
#ifdef Scale_byPix
int src_Width = pix.width(); //获取原始图像宽高
int src_height = pix.height();
//通过QT QPixmap缩放图像,缩放后的图像保存在pix_dest
QPixmap pix_dest = pix_src.scaled(src_Width*val/10, src_height*val/10, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
#endif
//获得缩放后的图像pixmap后,下面的代码用于将图像显示到lable上
label->clear();
label->setPixmap(pix_dest); //当通过Opencv缩放,执行到这里异常;但通过QPixmap缩放,执行正确
label->show();
}
//Mat转Pixmap
QPixmap MainWindow::cvMat2QPixmap(const cv::Mat &inMat)
{
return QPixmap::fromImage(cvMat2QImage(inMat));
}
//Mat转QImage
QImage MainWindow::cvMat2QImage(const cv::Mat &mat ) {
switch ( mat.type() )
{
// 8-bit, 4 channel
case CV_8UC4:
{
QImage image( mat.data, mat.cols, mat.rows, (int)mat.step, QImage::Format_RGB32 );
return image;
}
// ..... 经测试,输入的图格式为CV_8UC4,仅保留该分支,其它略
default:
qDebug("Image format is not supported: depth=%d and %d channels\n", mat.depth(), mat.channels());
break;
}
return QImage();
}