将 cv::Mat 向量复制到浮点向量的最佳方法是什么?
What is the best way to copy a vector of cv::Mat to a vector of float?
假设我们有一组 cv::Mat
个对象,它们都是相同类型 CV_32F
和相同大小:这些矩阵之前已插入到 vector<cv::Mat>
.
// input data
vector<cv::Mat> src;
我想将 src
向量中的所有元素复制到单个 vector<float>
对象中。换句话说,我想复制(到目标向量)src
向量矩阵中包含的所有 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);
}
如何进一步提高复制速度?
您应该使用 vector::reserve()
以避免在插入时重复重新分配和复制。如果不复制数据,则不必使用 reshape()
——datastart
和 dataend
不一定不变。试试这个:
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
个对象,它们都是相同类型 CV_32F
和相同大小:这些矩阵之前已插入到 vector<cv::Mat>
.
// input data
vector<cv::Mat> src;
我想将 src
向量中的所有元素复制到单个 vector<float>
对象中。换句话说,我想复制(到目标向量)src
向量矩阵中包含的所有 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);
}
如何进一步提高复制速度?
您应该使用 vector::reserve()
以避免在插入时重复重新分配和复制。如果不复制数据,则不必使用 reshape()
——datastart
和 dataend
不一定不变。试试这个:
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);
}