调整大小的 opencv 图像在 QWidget C++ 上未正确显示

Posted

技术标签:

【中文标题】调整大小的 opencv 图像在 QWidget C++ 上未正确显示【英文标题】:Resized opencv image is not displayed correctly on QWidget C++ 【发布时间】:2021-02-03 11:31:07 【问题描述】:

我尝试在 QLabel 上显示大小为 3000 * 4096 的 OpenCV 图像。图像在显示前调整大小。如果尺寸可整除的resize factor(例如2、4、8、16、32),则图像显示正确。如果大小不能被因子整除(例如 3、5、7、10),则图像无法正确显示。 我也尝试使用重新缩放因子而不是 cv:Size() 作为输入,但它的行为相似。例如:与fx = fy = 0.25 一起正常工作,但与fx=fy=0.3 不正确。

OpenCV 显示,比例因子 = 4:

在 QLabel 上显示,比例因子 = 4:

OpenCV显示,比例因子=10:

在 QLabel 上显示,比例因子 = 10:

以下是代码摘要:

resize(opencv_image, img_resize, cv::Size(opencv_image_.cols/4, opencv_image_.rows/4), 0, 0, cv::INTER_AREA);
ui->lbl_continuous_grab->setPixmap(QPixmap::fromImage(PutImage(img_resize)));

QImage PutImage(const Mat& mat)

    // 8-bits unsigned, NO. OF CHANNELS=3
    // Copy input Mat
    const uchar *qImageBuffer = (const uchar*)mat.data;
    // Create QImage with same dimensions as input Mat
    QImage img(qImageBuffer, mat.cols, mat.rows, QImage::Format_RGB888);
    return img.rgbSwapped();

【问题讨论】:

asmaloney.com/2013/11/code/… 【参考方案1】:

所以问题是OpenCV的step是一个size_t,当你把图片转换成QImage的时候需要强制转换成int。但是,我仍然不知道为什么当图像大小可以被调整大小整除时它会起作用。

QImage img(qImageBuffer, mat.cols, mat.rows, static_cast<int>(mat.step), QImage::Format_RGB888);

【讨论】:

以上是关于调整大小的 opencv 图像在 QWidget C++ 上未正确显示的主要内容,如果未能解决你的问题,请参考以下文章

使用 opencv 在 GPU 上调整图像大小会产生空输出矩阵

为啥在 OpenCv 中调整图像大小会降低相机校准的重投影误差?

使用 OpenCV 调整图像大小

OpenCV:自动将窗口大小调整为显示的图像

如何在opencv python中调整PNG图像的大小? [复制]

调整大小时Python OpenCV图像打乱[重复]