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

Posted

技术标签:

【中文标题】将 cv::Mat 向量复制到浮点向量的最佳方法是啥?【英文标题】:What is the best way to copy a vector of cv::Mat to a vector of float?将 cv::Mat 向量复制到浮点向量的最佳方法是什么? 【发布时间】:2015-01-19 23:55:33 【问题描述】:

假设我们有一组cv::Mat 对象,它们都是相同类型的CV_32F 和相同的大小:这些矩阵之前已插入到vector<cv::Mat>

// input data
vector<cv::Mat> src;

我想将src 向量中的所有元素复制到单个vector&lt;float&gt; 对象中。换句话说,我想复制(到目标向量)float 向量矩阵中包含的所有 float 元素。

// destination vector
vector<float> dst;

我目前正在使用下面的源代码。

vector<cv::Mat>::const_iterator it;
for (it = src.begin(); it != src.end(); ++it)

    vector<float> temp;
    it->reshape(0,1).copyTo(temp);
    dst.insert(dst.end(), temp.begin(), temp.end());

为了提高复制的速度,我测试了下面的代码,但是我只得到了5%的加速。为什么?

vector<cv::Mat>::const_iterator it;
for (it = src.begin(); it != src.end(); ++it)

    Mat temp = it->reshape(0,1);   // reshape the current matrix without copying the data
    dst.insert(dst.end(), (float*)temp.datastart, (float*)temp.dataend);

如何进一步提高复制速度?

【问题讨论】:

【参考方案1】:

您应该使用vector::reserve() 以避免在插入时重复重新分配和复制。如果不复制数据,则不需要使用reshape()——datastartdataend 必须保持不变。试试这个:

dst.reserve(src.size() * src.at(0).total()); // throws if src.empty()
for (vector<cv::Mat>::const_iterator it = src.begin(); it != src.end(); ++it)

    dst.insert(dst.end(), (float*)src.datastart, (float*)src.dataend);

【讨论】:

以上是关于将 cv::Mat 向量复制到浮点向量的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Uchar 到 cv::Mat 的向量

需要一种更快的方法将 cv::Mat 转换为一维向量形式

std::vector<cv::Vec3b> 到 cv::Mat

向量的 OpenCV 向量到 cv::Mat

如何在向量中找到相同的 cv::Mat<cv::Mat>

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