2014-10-18 46 views
4

我正在使用OpenCV和cv::Mat对象,我需要知道我的矩阵为了将它传递给低级C API而占用的字节数。看来OpenCV的API没有返回矩阵使用的字节数的方法,而且我只有一个原始的uchar *data公共成员,没有包含其实际大小的成员。查找cv的字节大小:: Mat

如何找到以字节为单位的cv::Mat大小?

回答

20

的常见的答案是计算在矩阵元素的总数和由每个元件的尺寸相乘,这样的:

// Given cv::Mat named mat. 
size_t sizeInBytes = mat.total() * mat.elemSize(); 

这将在常规场景中,其中该矩阵被分配工作作为内存中的连续块。

但请考虑系统对矩阵中每行的字节数有对齐限制的情况。在这种情况下,如果mat.cols * mat.elemSize()未正确对齐,mat.isContinuous()false,并且之前的大小计算错误,因为mat.elemSize()将具有相同数量的元素,尽管缓冲区较大!

正确答案,那么,就是找到字节每个矩阵行的大小,并与行数乘以:

size_t sizeInBytes = mat.step[0] * mat.rows; 

了解更多关于stephere

+0

很好解释!步骤*行方案也可以在连续的情况下工作,不是吗?但是这是一个问题,您的低级API是否可以处理不连续的图像。 – Micka 2014-10-18 17:27:57

+0

它也可以在连续的场景中工作,因为'mat.step [0] == mat.cols * mat.elemsize()'。是的,它可以处理非连续的缓冲区(我正与iOS上的ImageIO一起将图像直接压缩到磁盘)。 – StatusReport 2014-10-18 17:41:26