OpenCV: OpenCV modules
Mat Mat::isContinuous() 说明:
报告矩阵是否连续。
如果矩阵元素在每行末尾连续存储而没有间隙,则方法返回true。 否则,它返回false。 显然,对于1x1或1xN矩阵总是连续的。一般 用Mat :: create创建的矩阵总是连续的。 但是,如果使用Mat :: col,Mat :: diag等提取矩阵的一部分,或者为外部分配的数据构造矩阵头,则此类矩阵可能不再具有此属性。
OpenCV isContinuous()连续存储的问题_pan_jinquan的博客-CSDN博客
Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP);
Mat::Mat(int _rows, int _cols, int _type, void* _data, size_t _step)
: flags(MAGIC_VAL + (_type & TYPE_MASK)), dims(2), rows(_rows), cols(_cols),
data((uchar*)_data), datastart((uchar*)_data), dataend(0), datalimit(0),
allocator(0), u(0), size(&rows)
{
CV_Assert(total() == 0 || data != NULL);
size_t esz = CV_ELEM_SIZE(_type), esz1 = CV_ELEM_SIZE1(_type);
size_t minstep = cols * esz;
if( _step == AUTO_STEP )
{
_step = minstep;
}
else
{
CV_Assert( _step >= minstep );
if (_step % esz1 != 0)
{
CV_Error(Error::BadStep, "Step must be a multiple of esz1");
}
}
step[0] = _step;
step[1] = esz;
datalimit = datastart + _step * rows;
dataend = datalimit - _step + minstep;
updateContinuityFlag();
}
inline
const size_t& MatStep::operator[](int i) const CV_NOEXCEPT
{
return p[i];
}
template _Tp& at(int row, int col) {
return ((_Tp*)(data + step.p[0] * i0))[i1];
}
由上面可见,step[0]指向step.p[0],即p[0]为每行占据的字节数,p[1]为每个像素占据的字节数。
depth 和channels
CV_8UC4 CV_MAKETYPE(CV_8U,4),其中4为channels()(通道数), CV_8U为 depth()
inline
int Mat::depth() const
{
// ((flags) & CV_MAT_DEPTH_MASK) =>
// (flags & (CV_DEPTH_MAX - 1))
return CV_MAT_DEPTH(flags);
}
inline
int Mat::channels() const
{
// ((((flags) & CV_MAT_CN_MASK) >> CV_CN_SHIFT) + 1) =>
// ((((flags) & ((CV_CN_MAX - 1) << CV_CN_SHIFT)) >> CV_CN_SHIFT) + 1) =>
// (((flags & (511 << CV_CN_SHIFT)) >> CV_CN_SHIFT) + 1)
// CV_8UC4 => (CV_MAT_DEPTH(0) + (((4)-1) << CV_CN_SHIFT))
// => (((0) & CV_MAT_DEPTH_MASK) + (((4)-1) << CV_CN_SHIFT))
// => ((0 & CV_MAT_DEPTH_MASK) + (3 << CV_CN_SHIFT))
// 从上可以看出CV_8UC4 CV_MAKETYPE(CV_8U,4),其中4为通道数, CV_8U为 depth()
return CV_MAT_CN(flags);
}
#define CV_CN_SHIFT 3
#define CV_CN_MAX 512
#define CV_MAT_CN_MASK ((CV_CN_MAX - 1) << CV_CN_SHIFT)
#define CV_MAT_CN(flags) ((((flags) & CV_MAT_CN_MASK) >> CV_CN_SHIFT) + 1)
#define CV_MAT_CN(flags) ((((flags) & CV_MAT_CN_MASK) >> CV_CN_SHIFT) + 1)
#define CV_MAT_DEPTH_MASK (CV_DEPTH_MAX - 1)
#define CV_MAT_DEPTH(flags) ((flags) & CV_MAT_DEPTH_MASK)
#define CV_8U 0
#define CV_8S 1
#define CV_16U 2
#define CV_MAKETYPE(depth,cn) (CV_MAT_DEPTH(depth) + (((cn)-1) << CV_CN_SHIFT))
#define CV_8UC3 CV_MAKETYPE(CV_8U,3)
#define CV_8UC4 CV_MAKETYPE(CV_8U,4)



