调整大小的 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 中调整图像大小会降低相机校准的重投影误差?