【问题标题】:How to create vector<Mat>?如何创建向量<Mat>?
【发布时间】:2021-03-27 01:23:14
【问题描述】:

我尝试运行此代码来创建 vector&lt;Mat&gt;

vector<Mat> scoreImgs(8, Mat(size, CV_32FC1));

我发现它不是深拷贝。我不想使用forwhile 之类的:

for (int i = 0; i < 8; ++i) 
{
    scoreImgs[i] = move(Mat(size, CV_32FC1));
}

那么我怎样才能创建一个带有深拷贝的vector&lt;Mat&gt;

【问题讨论】:

  • 你是怎么发现不是深拷贝
  • @Scheff 这是 OpenCV 库的本质。 Mat in 更像是指向矩阵的智能指针。
  • @MarekR Yepp。我刚刚找到了医生。关于复制构造函数cv::Mat::Mat(const Mat&)

标签: c++ opencv vector mat


【解决方案1】:
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;
}

【讨论】:

    【解决方案2】:

    如果您要为正在创建的所有对象初始化相同的值,那么 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;
    }
    

    【讨论】:

    • OP 写道:I don't want to use for or while like.
    • 是的,这是真的。在这种情况下,您提出的解决方案就是重点。我只是提供一个解决方案,您不必使用new 运算符
    • 感谢您的帮助。我的目标是提前为后续代码分配空间。我正在寻找一种简单有效的方法。
    猜你喜欢
    • 2015-02-18
    • 1970-01-01
    • 2014-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多