为未知大小的 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 保留向量内存的主要内容,如果未能解决你的问题,请参考以下文章