Opencv中IplImage的四位元組對齊問題

2021-08-16 21:20:07 字數 1243 閱讀 2359

iplimage資料結構體中有兩個寬度:

1 是width屬性,表示影象的每行畫素數;

2 是widthstep屬性,表示儲存一行畫素需要的位元組數。

在opencv裡邊,widthstep必須是4的倍數,從而實現位元組對齊,有利於提高運算速度。所以widthstep不等於width*nchannels。

三通道位元組影象中,imagedata排列如下,其中bgr分別為每個畫素的三個通道值。

舉例:如果單通道影象寬度為3,由於不是4的整數倍,所以加乙個位元組補齊,則widthstep是4。即這個影象的一行需要4個位元組,只使用前3個,最後乙個空著。

也就是乙個寬3高3的影象的imagedata資料大小為4*3=12位元組。

注意,在不知道imagedata是四位元組對齊的情況下直接讀取,會造成錯位。空著的那個畫素並不是無效的,它仍然可以被操作。

二、去掉補齊位,正常讀取

unsigned char* colors1 = (unsigned char*)input->imagedata;

unsigned char* colors2 = (unsigned char*)test->imagedata;

//位元組對齊

int widths = input->width; //每行畫素個數

int heights = input->height;

int widthsteps = input->widthstep; //儲存一行畫素需要的位元組數

int cn = input->nchannels;

unsigned char* color1 = (unsigned char*)malloc(3* widths * heights *sizeof(unsigned char));

unsigned char* color2 = (unsigned char*)malloc(3* widths * heights *sizeof(unsigned char));

for (int i = 0; i < heights; i++)

for (int j = 0; j < widths; j++)

}

理解:

i*widthsteps + j*cn + k中,i*widthsteps計算前幾行的位元組數,j*cn計算當前行已經占有的位元組數,再加上1 2 3.

i*widths*cn + cn*j + k中, i*widths*cn是計算前幾行占有的位元組數,j*cn計算當前行已經占有的位元組數,再加上1 2 3.

OpenCV中建立Iplimage的方法

1,如果是從新創造乙個 iplimage 則用iplimage cvcreateimage cvsize size,int depth,int channels 它建立頭並分配資料。注 當不再使用這個新影象時,要呼叫 void cvreleaseimage iplimage image 將它的頭和影...

關於OpenCV中IplImage的位元組對齊問題

最近利用做專案,遇到了乙個問題 我是用opencv讀的影象,然後自己新開闢了乙個空間,以下是 byte inputimage null iplimage image get null image get cvloadimage imagename,0 imagewidth image get wid...

關於OPENCV中IplImage所儲存

關於opencv中iplimage所儲存資料的討論 shelliar opencv一書中,對iplimage和cvmat的講述不夠詳細,很多時候當我們處理影象的時候,我們會避免用cvmat而是直接用iplimage的方法。iplimage這個結構體中儲存影象資料的部分是char imagedata,...