1,ptr,at的原理
在分析ptr,at等函数时,首先要有的概念是,图像是矩阵同时在内存中是一维数组的形式存放,了解这个概念下面的分析才可以很好的理解。
inline
const uchar* Mat::ptr(const int* idx) const
{
int i, d = dims;
uchar* p = data;
CV_DbgAssert( d >= 1 && p );
for( i = 0; i < d; i++ )
{
CV_DbgAssert( (unsigned)idx[i] < (unsigned)size.p[i] );
p += idx[i] * step.p[i];
}
return p;
}
template inline
_Tp& Mat::at(int i0, int i1)
{
CV_DbgAssert(dims <= 2);
CV_DbgAssert(data);
CV_DbgAssert((unsigned)i0 < (unsigned)size.p[0]);
CV_DbgAssert((unsigned)(i1 * DataType<_Tp>::channels) < (unsigned)(size.p[1] * channels()));
CV_DbgAssert(CV_ELEM_SIZE1(DataType<_Tp>::depth) == elemSize1());
return ((_Tp*)(data + step.p[0] * i0))[i1];
}
2,MSize,MStep的原理
假设有数组p[3][5]如表1所示,由于在内存中是一维线性存储的,故内存中应为表2所示。 表1123456789101112131415表2
123456789101112131415p[1][0]=6=p[p+1*5+0] 由该式可以知道,
MSize,MStep存在的意义就是为了解决内存坐标地址的定位。step[0]代表一维空间的大小,该例中即为5.于是at函数就可以很好的解释了data(图像内存首地址) + i0*step.p[0] + i1*step.p[1])。进一步了解参考该博客点击打开链接。