1.原型解释
先解释下(void*)(img.data + point.y * img.step + point.x * img.elemSize())出现的类:
Mat mat( winSize.height, winSize.width, CV_8UC1, (void*)(img.data + point.y * img.step + point.x * img.elemSize()), img.step );
其旨在截取图像中点(x, y)到图像的右下角位置处的图像,赋值给对象mat。
这种定义方法的原型为:Mat (int rows, int cols, int type, void *data, size_t step=AUTO_STEP)
- data:指向用户数据的指针。这种方法不会为创建的对象分配数据空间,而是使用data指向出的数据,这也意味着数据没有发生复制行为。所以创建MAT类的方式非常高效,可用于OpenCV函数对外部data数据的处理,但外部的data不会被自动释放掉,这是需要注意的。
- step:矩阵每一行所占据的字节数。该值应包括每行末尾的填充字节(如果有的话)。 如果step使用默认值AUTO_STEP的话,它将自动使用值cols * elemSize()进行自动填充。
2.含义解释
解释:(void*)(img.data + point.y * img.step + point.x * img.elemSize())
- img.step:表示图像矩阵中每行所包含的字节数
- img.elemSize():图像中每个像素点所包含的字节数
该语句所包含的意思自然也就出来了,即表示在指针data上偏移了point.y * img.step + point.x * img.elemSize()了这么多字节,也就意味着新创建的矩阵对象mat将使用原图像(x, y)坐标至右下角处的数据,和Rect有异曲同工之妙。
该语句还可以这样写:
对于二维图像而言,step[0]表示图像中一行所包含的字节数,step[1]表示图像中一个像素点所包含的字节数。
但对于三维图像,step[0]将表示图像中一个面所包含的字节数,step[1]表示图像中一行所包含的字节数,step[2]表示图像中一个像素点所包含的字节数。
3.拓展
MAT类的构造函数
- Mat ()
- Mat (int rows, int cols, int type)
- Mat (Size size, int type)
- Mat (int rows, int cols, int type, const Scalar &s)
- Mat (Size size, int type, const Scalar &s)
- Mat (int ndims, const int *sizes, int type)
- Mat (int ndims, const int *sizes, int type, const Scalar &s)
- Mat (const Mat &m)
- Mat (int rows, int cols, int type, void *data, size_t step=AUTO_STEP)
- Mat (Size size, int type, void *data, size_t step=AUTO_STEP)
- Mat (int ndims, const int *sizes, int type, void *data, const size_t *steps=0)
- Mat (const Mat &m, const Range &rowRange, const Range &colRange=Range::all())
- Mat (const Mat &m, const Rect &roi)
- Mat (const Mat &m, const Range *ranges)
- 详细释义参见Reference。
MAT类部分成员的意思
- image.channels():图像的通道数,RGB图像为三通道。
- image.total():图像总的像素个数。
- img.step:表示图像矩阵中每行所包含的字节数。
- img.elemSize():图像中每个像素点所包含的字节数。