Mat 中的畫素訪問

OpenCV Mat 結構中的單個畫素訪問可以通過多種方式實現。要了解如何訪問,最好先學習資料型別。

Basic Structures 解釋了基本資料型別。簡而言之,CV_<bit-depth>{U|S|F}C(<number_of_channels>) 是一種型別的基本結構。除此之外,瞭解 Vec 結構也很重要。

typedef Vec<type, channels> Vec< channels>< one char for the type>

其中 type 是 uchar, short, int, float, double 之一,每種型別的字元分別是 b, s, i, f, d

例如,Vec2b 表示 unsigned char vector of 2 channels

考慮 Mat mat(R,C,T),其中 R 是#rows,C 是#cols,T 是型別。訪問 mat 的(i, j)座標的一些示例是:

2D:

If the type is CV_8U or CV_8UC1 ---- //they are alias
mat.at<uchar>(i,j) // --> This will give char value of index (i,j)
//If you want to obtain int value of it
(int)mat.at<uchar>(i,j)

If the type is CV_32F or CV_32FC1 ---- //they are alias
mat.at<float>(i,j) // --> This will give float value of index (i,j)

3D:

If the type is CV_8UC2 or CV_8UC3 or more channels
mat.at<Vec2b/Vec3b>(i,j)[k] // note that (k < #channels)
//If you want to obtain int value of it
(int)mat.at<uchar>(i,j)[k] 

If the type is CV_64FC2 or CV_64FC3 
mat.at<Vec2d/Vec3d>(i,j)[k] // note that k < #channels

請注意,在 <...> 中輸入正確的型別非常重要,否則,你可能會遇到執行時錯誤或不需要的結果。