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