【问题标题】:Finding the size in bytes of cv::Mat查找 cv::Mat 的字节大小
【发布时间】:2014-10-18 14:53:45
【问题描述】:

我将 OpenCV 与 cv::Mat 对象一起使用,我需要知道我的矩阵占用的字节数才能将其传递给低级 C API。似乎 OpenCV 的 API 没有返回矩阵使用的字节数的方法,而且我只有一个原始的 uchar *data 公共成员,没有包含其实际大小的成员。

如何找到cv::Mat 的字节大小?

【问题讨论】:

    标签: opencv


    【解决方案1】:

    常见的答案是计算矩阵中元素的总数,然后乘以每个元素的大小,如下所示:

    // 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的信息。

    【讨论】:

    • 解释得很好! step*rows 场景也可以在连续场景中工作,不是吗?但问题是您的低级 API 是否可以处理不连续的图像。
    • 它也可以在连续场景下工作,从那时起mat.step[0] == mat.cols * mat.elemsize()。是的,它可以处理非连续缓冲区(我正在 iOS 上使用 ImageIO 将图像直接压缩到磁盘)。
    猜你喜欢
    • 2023-03-28
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-01
    • 1970-01-01
    • 2013-02-18
    相关资源
    最近更新 更多