【发布时间】:2014-10-18 14:53:45
【问题描述】:
我将 OpenCV 与 cv::Mat 对象一起使用,我需要知道我的矩阵占用的字节数才能将其传递给低级 C API。似乎 OpenCV 的 API 没有返回矩阵使用的字节数的方法,而且我只有一个原始的 uchar *data 公共成员,没有包含其实际大小的成员。
如何找到cv::Mat 的字节大小?
【问题讨论】:
标签: opencv
我将 OpenCV 与 cv::Mat 对象一起使用,我需要知道我的矩阵占用的字节数才能将其传递给低级 C API。似乎 OpenCV 的 API 没有返回矩阵使用的字节数的方法,而且我只有一个原始的 uchar *data 公共成员,没有包含其实际大小的成员。
如何找到cv::Mat 的字节大小?
【问题讨论】:
标签: opencv
常见的答案是计算矩阵中元素的总数,然后乘以每个元素的大小,如下所示:
// 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的信息。
【讨论】:
mat.step[0] == mat.cols * mat.elemsize()。是的,它可以处理非连续缓冲区(我正在 iOS 上使用 ImageIO 将图像直接压缩到磁盘)。