最近利用做專案,遇到了乙個問題:我是用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...