Я пытаюсь запустить этот код, чтобы создать 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> с глубокой копией.
@Scheff это природа библиотеки OpenCV. Mat в работе больше похож на умный указатель на матрицу.
@MarekR Йепп. Я только что нашел док. о конструкторе копирования cv::Mat::Mat(const 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;
}
Если у вас есть одинаковые значения для инициализации для всех объектов, которые вы создаете, то ответ Мерека Р. является хорошим способом.
в качестве альтернативы вы можете просто использовать метод 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;
}
ОП писал(а): I don't want to use for or while like.
Да, это правда. В этом случае предложенное вами решение относится к делу. Я просто предлагаю решение, в котором вам не нужно использовать оператор new.
Спасибо за вашу помощь. Моя цель — заранее выделить место для последующего кода. Я ищу простой и эффективный способ.
Как вы обнаружили, что это не глубокая копия?