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

Resized opencv image is not displayed correctly on QWidget C++

我尝试在 QLabel 上显示大小为 3000 * 4096 的 OpenCV 图像。图像在显示前调整大小。如果大小可整除的调整大小因子(例如 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();
}

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

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