【问题标题】:Opencv c++ resize function: new Width should be multiplied by 3Opencv c++ resize函数:新宽度应乘以3
【发布时间】:2018-06-02 06:53:56
【问题描述】:

我正在 Qt 环境中编程,我有一个大小为 2592x2048 的 Mat 图像,我想将其调整为我拥有的“标签”的大小。但是当我想显示图像时,我必须将宽度乘以 3,以便图像以正确的大小显示。有什么解释吗?

这是我的代码:

//Here I get image from the a buffer and save it into a Mat image.
//img_width is 2592 and img_height is 2048
Mat image = Mat(cv::Size(img_width, img_height), CV_8UC3, (uchar*)img, Mat::AUTO_STEP);
Mat cimg;
double r; int n_width, n_height;
//Get the width of label (lbl) into which I want to show the image
n_width = ui->lbl->width();
r = (double)(n_width)/img_width;
n_height = r*(img_height);
cv::resize(image, cimg, Size(n_width*3, n_height), INTER_AREA);

谢谢。

【问题讨论】:

  • 解释具体含义:所以图像以正确的尺寸显示,你可以显示你得到的图像。
  • @Soroor:没有OpenCV可以尝试,但我的猜测是你需要传递每行的字节数,这意味着每行的像素数(宽度)并乘以字节每像素,最后得到未压缩图像的大小,乘以高度!所以我的猜测是你需要传递图像的字节数,它可能等于或不等于像素数!
  • 3*width 是步幅,这就是你需要它的原因。这是每行的字节数,假设你有 3 个通道,这就是 3 的来源
  • @eyllanesc 是的,3 我得到了我想要的。抱歉我的描述含糊。
  • @AhmedSaleh Antonion Dias 所以我的问题是如果我需要传递每行的字节数,为什么只传递宽度?而不是高度?我也有同样的猜测,将图像类型更改为 8UC1,但问题再次存在......

标签: c++ qt opencv resize


【解决方案1】:

resize 功能运行良好,因为如果您将调整大小的图像保存为文件,则可以正确显示。由于您想在 QLabel 上显示它,我假设您必须先将图像转换为 QImage,然后再转换为 QPixmap。我相信问题出在步骤或图像格式上。

如果我们保证传入的图片数据

Mat image = Mat(cv::Size(img_width, img_height), CV_8UC3, (uchar*)img, Mat::AUTO_STEP);

确实是RGB图像,那么下面的代码应该可以工作:

ui->lbl->setPixmap(QPixmap::fromImage(QImage(cimg.data, cimg.cols, cimg.rows, *cimg.step.p, QImage::Format_RGB888 )));

最后,您可以使用构造函数构造一个 QImage 对象,而不是使用 OpenCV

QImage((uchar*)img, img_width, img_height, QImage::Format_RGB888)

然后使用scaledToWidth 方法来调整大小。 (请注意,此方法返回缩放后的图像,并且不对图像本身执行调整大小操作)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    • 1970-01-01
    • 2021-01-23
    • 2014-11-21
    • 2013-09-17
    相关资源
    最近更新 更多