两讲介绍了如何遍历Mat的连续数据空间和不连续的数据空间,这两种方式相对都比较直接和粗暴,直接访问data字段。接下来介绍一些相对委婉和优雅的方式,今天来看看ptr模版函数的方式。
ptr模版函数是Opencv Mat类提供的一种访问数据的方式,基本使用方式大概如下:
mat.ptr<Vec3b>(row)
mat.ptr<Vec3b>(row, col)
OpenCV的Mat类提供的这种ptr模版函数的方式有两个比较明显的优点:
看起来比较直观,可读性较好;
如果出现错误,可以抛出异常,这样更加保证程序的健壮性。
for (int row = 0; row < mat.rows; row++)
{
for (int col = 0; col < mat.cols; col++)
{
Vec3b *c = mat.ptr<Vec3b>(row, col);
c->val[0] = 0; //B
c->val[1] = 255; //G
c->val[2] = 0; //R
}
}
这段代码不用太多解释了,只说一下Vec3b,这是OpenCV自定义的一个数据结构,内部有3个uchar的成员,分别来表示B, , R的值。