Reputation: 3
I try to run this code to crate a vector<Mat>
vector<Mat> scoreImgs(8, Mat(size, CV_32FC1));
I found it was not deep copy. I don't want to use for
or while
like:
for (int i = 0; i < 8; ++i)
{
scoreImgs[i] = move(Mat(size, CV_32FC1));
}
So how can I create a vector<Mat>
with deep copy.
Upvotes: 0
Views: 903
Reputation: 2249
If you have same values to be initialized for all the objects you are creating, then answer by Merek R is good way.
alternatively you can simply use emplace_back()
method for std::vector
I assume you would have different values to be initialized for 8 different objects you are instantiating so I used for loop below to demonstrate.
Reference: 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;
}
Upvotes: 0
Reputation: 37607
vector<Mat> scoreImgs;
std::generate_n(std::back_inserter(scoreImgs), 8,
[]() { return Mat(size, CV_32FC1); });
It might be useful to write helper function:
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;
}
Upvotes: 3