cvTranspose提供不同的图像大小?

cvTranspose提供不同的图像大小?,c,opencv,C,Opencv,我是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(cvSi

我是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
字节,因为它是一个
无符号字符。但是
imgT
的大小为331328

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

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

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


第二幅图像的宽度为493(由于转置),不能除以4。可除以4的下一个较大的数字是496,因此您的行实际上是496字节宽,每行末尾有3个未使用的字节,以便在4字节边界对齐行。事实上,496*668实际上是331328。因此,您应该始终注意这样一个事实,即图像元素不必是连续的(至少它们在一行中应该是连续的)。

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

您使用的是哪个OpenCV版本和哪个平台?(Windows,Linux,MaCOSX)你说的“我检查图像”是什么意思?我用Currase= SRC的高度和高度= SRC的宽度来转换新的图像,得到了我的工作CVTSPOSE……(虽然我通常同意C++的API),但是如果他敢检查,那么这将给他带来一个意想不到的大小问题。他也不得不担心IplImage(它或多或少也是由OpenCV管理的),但他确实这样做了,并发现了一些意想不到的事情,而您并没有真正提供答案。这更适合作为评论。