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

请注意,在 <...> 中输入正确的类型非常重要,否则,你可能会遇到运行时错误或不需要的结果。