2011-06-15 135 views
3

我是OpenCV的新手,我想转置一个灰度图像,但我得到了错误的输出大小。cvTranspose给出不同的图像大小?

// 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等。

+0

OpenCV的哪个版本,您使用什么平台? (Windows,Linux,MacOSX) – karlphillip 2011-06-15 19:41:09

+0

“当我检查图像时”是什么意思? – 2011-06-15 19:56:14

+0

我使用与宽度= SRC的身高和身高= SRC的宽度转换新形象我的工作cvTranspose .. – AnkitRox 2016-04-29 11:49:58

回答

11

这是由于OpenCV以4字节边界对齐图像的行。在第一张图片中,一行是668字节宽,可以被4除,所以你的图像元素是连续的。

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

+0

+1好发现。你是对的! – karlphillip 2011-06-15 23:01:04

-1

您可以将您的图像在CV:垫(),并使用Mat.t()来调换它。行和列将自动分配/释放,所以你不必担心大小

+0

不过(虽然我大体上同意了偏爱C++ API),如果他胆敢检查它,这将赠给他意想不到的大小*完全相同的问题*。他不得不用* IplImage *(这或多或少由OpenCV管理)担心,但他确实发现了一些意想不到的情况,而你并没有真正提供答案。它更适合作为评论。 – 2013-06-05 10:53:33

相关问题