traincascade训练程序中出现的(void*)(img.data + point.y * img.step + point.x * img.elemSize())

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有异曲同工之妙。

该语句还可以这样写:
data
对于二维图像而言,step[0]表示图像中一行所包含的字节数,step[1]表示图像中一个像素点所包含的字节数。
但对于三维图像,step[0]将表示图像中一个面所包含的字节数,step[1]表示图像中一行所包含的字节数,step[2]表示图像中一个像素点所包含的字节数。

3.拓展

  1. 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
  2. MAT类部分成员的意思

    • image.channels():图像的通道数,RGB图像为三通道。
    • image.total():图像总的像素个数。
    • img.step:表示图像矩阵中每行所包含的字节数。
    • img.elemSize():图像中每个像素点所包含的字节数。
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值