可以使用OpenCV定義的宏來提取象素值
假設灰度圖像image,存取其i行j列的象素可以這樣:CV_IMAGE_ELEM(image, uchar,y, x)
如果是彩色圖像就是
CV_IMAGE_ELEM(image, uchar,y, 3*x)
CV_IMAGE_ELEM(image, uchar,y, 3*x+1)
CV_IMAGE_ELEM(image, uchar,y, 3*x+2)
CV_IMAGE_ELEM是一個宏,
#define CV_IMAGE_ELEM( image, elemtype, row, col ) \
(((elemtype*)((image)->imageData + (image)->widthStep*(row)))[(col)])
#define CV_MAT_ELEM( mat, elemtype, row, col ) \
(*(elemtype*)CV_MAT_ELEM_PTR_FAST( mat, row, col, sizeof(elemtype)))
呵呵,我一直把它當一個函數用,其實本質也沒有什么區別的
但要想正確的得到圖像的坐標為(x,y)點的像素值,是應該這樣寫CV_IMAGE_ELEM(Image, uchar, y, x)
要注意像素點的坐標xy和行列值的順序是相反的(可以仔細思考為什么)
我剛開始一直寫成CV_IMAGE_ELEM(Image, uchar, x, y),結果有時候就造成了訪問image越界,從而報錯,花了好長時間才搗鼓出來,
不過將IMAGE的數據按照原來的樣子復制到mat中可以這么寫:
CV_IMAGE_ELEM(pImage, uchar, i, j) = CV_MAT_ELEM(*mat, uchar, i, j)
不用改變順序
總之,當應用這個宏是如果老報錯,就試試換個順序,或者檢查訪問的地址是否越界