DSP

MSize,MStep,ptr,at的原理分析

2019-07-13 17:59发布

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表2123456789101112131415p[1][0]=6=p[p+1*5+0] 由该式可以知道,MSize,MStep存在的意义就是为了解决内存坐标地址的定位。step[0]代表一维空间的大小,该例中即为5.于是at函数就可以很好的解释了data(图像内存首地址) + i0*step.p[0] + i1*step.p[1])。进一步了解参考该博客点击打开链接