为未知大小的 cv::Mat 保留向量内存

Posted

技术标签:

【中文标题】为未知大小的 cv::Mat 保留向量内存【英文标题】:reserve vector memory for cv::Mat of unknown size 【发布时间】:2015-06-27 10:02:29 【问题描述】:

我想用给定的内存量初始化一个 std::vector,因此我必须使用std::vector::reserve。 我完全理解它适用于 int float 等数据类型。

但是对于cv::Mat 它应该如何工作,它需要多少内存基本上是可变的,具体取决于尺寸。

我想知道是否有办法用传入的矩阵的大小来初始化向量。否则我想将reserve() 与矩阵等数据类型一起使用是没有任何意义的。

【问题讨论】:

您也想预分配矩阵数据吗?很难,但您可以创建更大矩阵的子矩阵,或创建指向预分配数据的矩阵。 不,不是,我只是想到了向量如何为在这个特定点上未定义大小的矩阵保留内存。但是由于 cv 矩阵只包含指向数据的指针,因此我的任务实际上是不可能的。 【参考方案1】:

cv::mat矩阵分配构造函数中的数据。如您所见below 数据只是指向某些数据的指针:

class CV_EXPORTS Mat

public:
    // ... a lot of methods ...
    ...

    /*! includes several bit-fields:
         - the magic signature
         - continuity flag
         - depth
         - number of channels
     */
    int flags;
    //! the array dimensionality, >= 2
    int dims;
    //! the number of rows and columns or (-1, -1) when the array has more than 2 dimensions
    int rows, cols;
    //! pointer to the data
    uchar* data;

    //! pointer to the reference counter;
    // when array points to user-allocated data, the pointer is NULL
    int* refcount;

    // other members
    ...
;

数据不是静态存储在矩阵中的。所以每个垫子应该是相同的尺寸。 在您的用例中,使用向量甚至没有意义,因为您似乎不需要存储不同大小的对象(除非您还计划添加从 cv::Mat 派生的对象)

【讨论】:

好吧,我有 81 个 cv::Mat 具有相同的尺寸但不同的数据。这就是为什么我想知道。例如,如果我初始化 vector<int> v1(10),我假设 reserve 将保留 10 乘以 4 个字节的整数。所以向量需要的内存将被保留。现在我明白了cv::Mat基本上是指向数据,而不是持有它。【参考方案2】:

cv::mat 的堆栈大小在编译时与所有其他对象一样是恒定的。您可以使用sizeof(cv::mat) 来学习它。因此,您可以安全地将std::vector::reserve 用于任何对象。

【讨论】:

以上是关于为未知大小的 cv::Mat 保留向量内存的主要内容,如果未能解决你的问题,请参考以下文章

将 cv::Mat 向量复制到浮点向量的最佳方法是啥?

OpenCV:将不同的向量附加为一行

如何在 OpenCV Mat 中保留固定的缓冲区大小?

哪个向量和地图,使用更少的内存(大量数据和未知大小)

如何在不复制数据的情况下将 cv::Mat 转换为 2d std::vector

调整图像类型“Mat”opencv C++的大小