2011-06-15 134 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

相關問題