首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenCV的cv::Mat和CvMat行对齐

OpenCV的cv::Mat和CvMat行对齐
EN

Stack Overflow用户
提问于 2011-05-14 23:09:07
回答 1查看 6.3K关注 0票数 4

有没有人能给我解释一下OpenCV的CvMat (或者它的C++版本cv::Mat)的行对齐是如何工作的?例如,假设我有一个矩阵

代码语言:javascript
复制
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的一部分的情况下)?或者,是否存在一些特殊的配置,在这些配置中,由于内存对齐,数据中可能存在一些间隙?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-05-16 18:01:33

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

代码语言:javascript
复制
// 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,它告诉您连续行之间的偏移量:

代码语言:javascript
复制
// 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列的数据。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6002674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档