【问题标题】:cvTranspose Gives a Different Image Size?cvTranspose 给出不同的图像尺寸?
【发布时间】:2011-10-28 00:16:56
【问题描述】:

我是 OpenCV 新手,我想转置灰度图像,但输出大小错误。

// img is an unsigned char image
IplImage *img = cvLoadImage("image.jpg"); // where image is of width=668 height=493
int width  = img->width;
int height = img->height;

我想转置它:

IplImage *imgT = cvCreateImage(cvSize(height,width),img->depth,img->nChannels);

cvTranspose(img,imgT);

当我检查图像时,我看到原始图像 img 的大小为 329324,这是正确的:493*668* 1 字节,因为它是 unsigned char。但是imgT 的大小为 331328。

我不确定这是在哪里发生的。

编辑:1-我使用的是 Windows XP 和 OpenCV 2.2。 2- 当我检查图像时,我的意思是当我看到变量 imgT 的值时。如imgT->width、imgT->heigt、imgT->size等

【问题讨论】:

  • 您使用的是哪个 OpenCV 版本和什么平台? (Windows、Linux、MacOSX)
  • “当我检查图像时”是什么意思?
  • 我得到了我的工作 cvTranspose 使用转换宽度 = src 的高度和高度 = src 的宽度的新图像..

标签: c opencv


【解决方案1】:

这是因为 OpenCV 在 4 字节边界处对齐图像的行。在第一个图像中,一行是 668 字节宽,可以被 4 整除,因此您的图像元素是连续的。

第二个图像的宽度为 493(由于转置),不能被 4 整除。下一个可被 4 整除的更高数字是 496,因此您的行实际上是 496 字节宽,其中 3 个未使用的字节在每行的末尾,以在 4 字节边界处对齐行。而事实上 496*668 确实是 331328。所以您应该始终注意一个事实,即您的图像元素不必是连续的(至少它们应该在单行内是连续的)。

【讨论】:

    【解决方案2】:

    您可以将图像存储在 cv:Mat() 中并使用 Mat.t() 对其进行转置。行和列将自动分配/释放,因此您不必担心大小

    【讨论】:

    • 仍然(虽然我通常同意对 C++ API 的偏好)这会给他带来完全相同的问题,即如果他敢于检查它。他也不得不担心 IplImage (这也或多或少由 OpenCV 管理),但他确实发现了一些意想不到的东西,而你却没有' t真的提供答案。它更适合作为评论。
    猜你喜欢
    • 1970-01-01
    • 2015-02-28
    • 1970-01-01
    • 2018-12-19
    • 1970-01-01
    • 2019-12-22
    • 2015-12-12
    • 2011-04-21
    • 1970-01-01
    相关资源
    最近更新 更多