OpenCV位元組對齊

2021-07-23 16:36:19 字數 1027 閱讀 3862

iplimage中有兩個屬性易錯:一是width屬性;二是widthstep屬性。前者是表示影象的每行畫素數,後者指表示儲存一行畫素需要的位元組數。

在opencv裡邊,widthstep必須是4的倍數,從而實現位元組對齊,有利於提高運算速度。如果8u單通道影象寬度為3,那麼widthstep是4,加乙個位元組補齊。這個影象的一行需要4個位元組,只使用前3個,最後乙個空著。也就是乙個寬3高3的影象的imagedata資料大小為4*3=12位元組。需要注意的是,空著的那個畫素並不是無效的,它仍然可以被操作,這就是導致錯誤的根源。

錯例:假如現在有乙個char* data的指標指向乙個15*15的灰度影象的資料起始位址,我們想把影象資料通過cvshowimage函式顯示出來,比較直觀的一種做法如下:

......

iplimage* image = cvcreateimage(cvsize(15, 15), 8, 1);

memcpy(image->imagedata, data, 15*15);

cvnamedwindow("window");

cvshowimage("window", image);

cvwaitkey();

cvreleaseimage(&image);

cvdestroywindow("window");

......

你會發現,顯示的影象奇怪的往左下角歪過去了。當你看完這篇文章後希望不要再因為這個問題浪費你的時間了(shamed:這個問題鬱悶了我整整一天)。其實原因就在於,在cvcreateimage的時候,opencv為實現位元組對齊,使得每行資料實際有16個位元組(多出乙個),在使用memcpy的過程中,這些多出的位元組就把對應的資料給「吃」了,因為這些資料在cvshowimage的時候並不會顯示出來,這樣,第二行就少乙個位元組,第三行少兩個位元組,……,所以整個影象就偏向左下角了!知道這一點後可以將memcpy語句更改如下:

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

這樣,程式才能按我們的設想執行。

位元組順序 位元組對齊

一.位元組順序的產生 在計算機中,資料是以位元組為單位存放的,而c語言中只有char才是乙個位元組,其他如int,float都是大於乙個位元組,所以就存在將資料按怎樣的順序存放的問題。一般有大端序和小端序兩種方式,特殊的還有混合序,也就是兩種存放方式同時存在於乙個計算機系統中。上面講的都是主機位元組...

位元組順序 位元組對齊

一.位元組順序的產生 在計算機中,資料是以位元組為單位存放的,而c語言中只有char才是乙個位元組,其他如int,float都是大於乙個位元組,所以就存在將資料按怎樣的順序存放的問題。一般有大端序和小端序兩種方式,特殊的還有混合序,也就是兩種存放方式同時存在於乙個計算機系統中。上面講的都是主機位元組...

位元組對齊 8位元組對齊

參考博文 參考1 參考2 參考3 在記憶體管理中經常使用位元組對齊來管理分配的記憶體。1 原理 2 演算法 2.1unsigned intcalc align unsigned int n,unsigned align 2.2 更好的演算法 unsigned intcalc align unsign...