如何创建矢量<Mat>?
How to create vector<Mat>?
我尝试运行此代码来创建一个vector<Mat>
vector<Mat> scoreImgs(8, Mat(size, CV_32FC1));
我发现不是深拷贝。我不想使用 for
或 while
,例如:
for (int i = 0; i < 8; ++i)
{
scoreImgs[i] = move(Mat(size, CV_32FC1));
}
那么我怎样才能用深拷贝创建一个vector<Mat>
。
vector<Mat> scoreImgs;
std::generate_n(std::back_inserter(scoreImgs), 8,
[]() { return Mat(size, CV_32FC1); });
编写辅助函数可能会有用:
std::vector<Mat> vectorOfNClonedCvMat(cv::Mat toClone, size_t n)
{
std::vector<Mat> r;
r.reserve(n);
std::generate_n(std::back_inserter(r), n,
[&toClone]() { return toClone.clone(); });
return r;
}
如果您要为正在创建的所有对象初始化相同的值,那么 Merek R 的回答是个好方法。
或者你可以简单地使用 emplace_back()
方法来 std::vector
我假设你会为你正在实例化的 8 个不同的对象初始化不同的值,所以我在下面使用 for 循环来演示。
参考:http://www.cplusplus.com/reference/vector/vector/emplace_back/
#include <stdio.h>
#include <iostream>
#include <vector>
#define CV_32FC1 100
class Mat {
public:
Mat(int size, int cv) {}
~Mat() {}
};
int main()
{
int size = 50;
std::vector<Mat> scoreImgs;
for (int i = 0; i < 8; i++) {
scoreImgs.emplace_back(size, CV_32FC1);
}
return 0;
}
我尝试运行此代码来创建一个vector<Mat>
vector<Mat> scoreImgs(8, Mat(size, CV_32FC1));
我发现不是深拷贝。我不想使用 for
或 while
,例如:
for (int i = 0; i < 8; ++i)
{
scoreImgs[i] = move(Mat(size, CV_32FC1));
}
那么我怎样才能用深拷贝创建一个vector<Mat>
。
vector<Mat> scoreImgs;
std::generate_n(std::back_inserter(scoreImgs), 8,
[]() { return Mat(size, CV_32FC1); });
编写辅助函数可能会有用:
std::vector<Mat> vectorOfNClonedCvMat(cv::Mat toClone, size_t n)
{
std::vector<Mat> r;
r.reserve(n);
std::generate_n(std::back_inserter(r), n,
[&toClone]() { return toClone.clone(); });
return r;
}
如果您要为正在创建的所有对象初始化相同的值,那么 Merek R 的回答是个好方法。
或者你可以简单地使用 emplace_back()
方法来 std::vector
我假设你会为你正在实例化的 8 个不同的对象初始化不同的值,所以我在下面使用 for 循环来演示。
参考:http://www.cplusplus.com/reference/vector/vector/emplace_back/
#include <stdio.h>
#include <iostream>
#include <vector>
#define CV_32FC1 100
class Mat {
public:
Mat(int size, int cv) {}
~Mat() {}
};
int main()
{
int size = 50;
std::vector<Mat> scoreImgs;
for (int i = 0; i < 8; i++) {
scoreImgs.emplace_back(size, CV_32FC1);
}
return 0;
}