778bbn
778bbn

Reputation: 3

How to create vector<Mat>?

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

Answers (2)

Mital Vora
Mital Vora

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

Marek R
Marek R

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

Related Questions