Opencv缩放图片在QLable上显示问题

pkokocl 2020-07-08 06:28:43
问题描述:
环境: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();
}
...全文
8435 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
pkokocl 2020-07-08
  • 打赏
  • 举报
回复
引用 1 楼 mideum 的回复:
你用这个方法Mat转QImage的话,是用的mat所分配的内存地址(mat.data) 一旦mat重新分配了内存,原来的内存地址失效,而QImage/QPixmap这边使用这块内存的对象没有销毁的话,就会出问题了 比较安全的方法应该还是让QImage管理内存分配 你试试看把转换这里的return image;改成return image.copy();
改为 return image.copy() ,经测试问题解决。非常感谢,非常感谢!
mideum 2020-07-08
  • 打赏
  • 举报
回复
你用这个方法Mat转QImage的话,是用的mat所分配的内存地址(mat.data)
一旦mat重新分配了内存,原来的内存地址失效,而QImage/QPixmap这边使用这块内存的对象没有销毁的话,就会出问题了
比较安全的方法应该还是让QImage管理内存分配
你试试看把转换这里的return image;改成return image.copy();

16,238

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧