CV_IMAGE_ELEM讀取某點的像素

來源:互聯網
上載者:User

 

 可以使用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)

不用改變順序

總之,當應用這個宏是如果老報錯,就試試換個順序,或者檢查訪問的地址是否越界

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.