OpenCV的cv :: Mat& CvMat行对齐

时间:2011-05-14 15:09:07

标签: opencv memory-alignment

有人可以向我解释一下OpenCV的CvMat(或其C ++版本cv::Mat)的行对齐是如何工作的吗?例如,我们假设我有一个矩阵

CvMat *cvmat = cvCreateMat(2,3,CV_8UC1);
cvSet2D( cvmat, 0, 0, cvScalar(1) );
cvSet2D( cvmat, 0, 1, cvScalar(2) );
cvSet2D( cvmat, 0, 2, cvScalar(3) );
cvSet2D( cvmat, 1, 0, cvScalar(4) );
cvSet2D( cvmat, 1, 1, cvScalar(5) );
cvSet2D( cvmat, 1, 2, cvScalar(6) );

根据CvMat的文档,行应该对齐4个字节,即矩阵的第一行应填充一个零,第二行应从偏移量+4开始。但是,如果我调试这段代码,数据是连续的(即cvmat->data[1,2,3,4,5,6]),我没有看到任何4字节对齐。这是文档中的错误吗?假设CvMatcv::Mat的数据的连续性(在矩阵不属于另一个ofc的情况下)总是安全的吗?或者是否存在一些特殊配置,由于内存对齐,数据中可能存在一些空白?

1 个答案:

答案 0 :(得分:3)

假设连续性是不安全的。 cv::Mat有一个成员函数isContinuous,您可以检查其连续性(C API有一个宏,正如评论所说):

// returns true iff the matrix data is continuous
// (i.e. when there are no gaps between successive rows).
// similar to CV_IS_MAT_CONT(cvmat->type)
bool isContinuous() const;

还有一个成员step告诉你连续行之间的偏移:

// a distance between successive rows in bytes; includes the gap if any
size_t step;

因此,假设您有一个8位单通道图像,(x,y)处的像素偏移y * step + x

在许多情况下,您最终会得到非连续内存,并且它们不限于内存对齐。例如,如果您说cv::Mat r = mat.col(0),则不会复制数据,但r指向与mat相同的内存区域,只是使用不同的“标题”,因此“差距”表示你有矩阵中的数据不在第0列。