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

2021-06-06 07:25:52 字數 1686 閱讀 1353

最近利用做專案,遇到了乙個問題:我是用opencv讀的影象,然後自己新開闢了乙個空間,以下是**

byte *inputimage=null;

iplimage* image_get=null;

image_get=cvloadimage(imagename,0);

imagewidth=image_get->width;

imageheight=image_get->height;

inputimage=new byte(imageheight * imagewidth);

inputimage=image_get->imagedata;

這時候出問題了。我給inputimage分配的是乙個imageheight * imagewidth的空間,然而,讀入的影象為800*600的時候還沒問題

當為801*601的時候發現處理出來的結果不是那麼回事了。後來檢視發現image_get裡面的widthstep為804,而不是801.這才開始查詢問題

以下是引用的別人的文章:解決此問題。

opencv裡iplimage資料結構極易出錯的問題

對opencv稍有了解的同學都知道裡邊用於儲存影象資料的iplimage,其中有兩個屬性非常值得關注,稍不留神就會導致錯誤(後附錯例一則):

一是width屬性;二是widthstep屬性。

前者是表示影象的每行畫素數,後者指表示儲存一行畫素需要的位元組數。

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

如果8u單通道影象寬度為3,那麼widthstep是4,加乙個位元組補齊。這個影象的一行需要4個位元組,只使用前3個,最後乙個空著。

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

需要注意的是,空著的那個畫素並不是無效的,它仍然可以被操作,這就是導致錯誤的根源。

範例:

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

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

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

cvnamedwindow("window");

cvshowimage("window", image);

cvwaitkey();

cvreleaseimage(&image);

cvdestroywindow("window"); ......

你會發現,顯示的影象奇怪的往左下角歪過去了。

其實原因就在於,在cvcreateimage的時候,opencv為實現位元組對齊,使得每行資料實際有16個位元組(多出乙個),在使用memcpy的過程中,這些多出的位元組就把對應的資料給「吃」了,因為這些資料在cvshowimage的時候並不會顯示出來,這樣,第二行就少乙個位元組,第三行少兩個位元組,……,所以整個影象就偏向左下角了!

知道這一點後可以將memcpy語句更改如下:

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

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

注:如果是16bit資料,則每行資料大小需*2,即「data + 17*i*2, 17*2

fr:

python中關於Opencv中關於矩形的函式總結

最近處理影象,以前用的都是matlab,現在入手python比較慢,這幾天看到了很多命名和功能相似的函式,作個記錄總結一下 只是為了能夠看下函式知道它是做什麼的,因此不會對其用法說得面面俱到。看到乙個文章講得清晰詳實,分享一下 功能 計算輪廓內的面積 示例 輸入為乙個點集 contours 0 為前...

關於OPENCV中IplImage所儲存

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

opencv中關於畫素的常見操作

一 獲取影象畫素指標 mat.ptr int i 0 獲取畫素矩陣的指標,索引i表示第幾行,從0開始計行數。獲得當前行指標const uchar current myimage.ptr row 獲取當前畫素點p row,col 的畫素值 p row,col current col 二 畫素範圍處理s...