2011-07-12 64 views
3

我在OpenCV中使用cvLoadImage如下加載的二進制圖像的寬度和不同widthStep:用於OpenCV的二進制圖像

IplImage* myImg=cvLoadImage(<ImagePath> ,-1); //-1 so that it is read as it is. 

當我檢查myImg->寬度myImg-> widthStep,我驚訝地發現他們兩人的價值略有不同。然後我回過頭去查看數據集中的其他圖像,發現對於大多數情況下,這兩個值是相等的,但是對於一些相當大的圖像數量,兩者大多數情況下相差1或2。

雖然只有當彩色圖像的通道數大於1時,這兩個值是不同的,否則它們是一樣的。我錯了嗎?有沒有人注意過這種奇怪的行爲?

謝謝!

回答

6

顯然,如果寬度不是4的倍數,那麼爲了性能和對齊的原因,它會被填充到4的倍數。所以如果寬度是例如255,那麼widthStep將256

3

圖像的widthstep可以計算如下:

IplImage *img = cvCreateImage(cvSize(318, 200), IPL_DEPTH_8U, 1); 

int width = img->width; 
int nchannels = img->nChannels; 

int widthstep = ((width*sizeof(unsigned char)*nchannels)%4!=0)?((((width*sizeof(unsigned char)*nchannels)/4)*4) + 4):(width*sizeof(unsigned char)*nchannels); 
0

下一個僞代碼是基於@Nizar FAKHFAKH的回答一個小片段。它基本上是一樣的東西,但更清楚一點(至少對我來說,jeje)。這裏有雲:

 int size_row_raw = width * n_channels; 
     int rem = size_row_raw % 4; 
     int width_step = (rem == 0) ? size_row_raw : size_row_raw + rem; 

在這裏,我假設尺寸(無符號字符)= 1,我認爲這是對C#,因爲的sizeof(字節)= 1真。如果我們想將此變量添加到以前的僞代碼中,那麼更改很簡單,只需將第一行更改爲如下所示:

int size_row_raw = width * sizeof(datatype_of_interest)* n_channels;

+0

請不要回答2011年的過時問題。c-api不再活着,這是一個死的話題。你只會誤導noobs進行思考,這將是一個有效的選擇,並引發更多的問題/答案層出不窮。 – berak

+0

我欣賞@berak的評論。正如你所看到的,我是這個新手。我只是認爲這對那些仍然被迫使用舊的c-api(像我)的人會有所幫助。感謝您的評論。 – ryuzakyl

+0

我相信第三行可以簡化爲: 'int width_step = size_row_raw + rem;' –

相關問題