如何初始化包含opencv:matrices的2D向量?

时间:2014-01-26 15:37:30

标签: c++ opencv vector matrix initialization

对于我目前在c ++中的项目,我需要一个2D向量,其中包含opencv:Mat Matrices作为元素。 我找到了一个类似的例子,它创建了一个deques的2D矢量,它完全正常工作:

vector < vector < deque<int> > > deques_vect2D;
deques_vect2D.resize(vect_col, vector <deque<int> > (vect_row, deque<int> (deque_init_size, deque_init_value)));

然而,将其用于矩阵的2D矢量不会创建独立的矩阵,更改一个矩阵会导致更改2D矢量中的每个元素。似乎只存在一个矩阵。

// init 2D vector
vector < vector < Mat > > mat_vect2D;
mat_vect2D.resize(vect_col, vector < Mat > (vect_row, Mat(mat_row, mat_col, CV_32S, Scalar::all(0))));

// change only the first Matrix
mat_vect2D[0][0].at<int>(0, 0) = 1;
mat_vect2D[0][0].at<int>(0, 1) = 2;

for (int r = 0; r < num_of_row; r++)
    for (int c = 0; c < num_of_col; c++) {

        cout << mat_vect2D[c][r] << endl;           
}

// results in... (note how every matrix has changed)
[1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
(...)

是的,我确实需要矩阵作为2D矢量中的元素,因为这些元素应该在以后为其他算法输入(其他数据类型意味着大量的投射)。所以我更喜欢使用Matices作为元素的解决方案,但是矢量可能会被任何其他2D结构所取代。

1 个答案:

答案 0 :(得分:2)

我认为问题是您使用 fill构造函数

  

显式向量(size_type n,const value_type&amp; val = value_type(),                    const allocator_type&amp; alloc = allocator_type());

     

构造一个包含n个元素的容器。每个元素   是val的副本。

http://www.cplusplus.com/reference/vector/vector/vector/

因此,您将相同引用的每个元素2D初始化为Mat()对象。 在上面的示例中,它可以工作,因为您只将整数存储为值...

为什么你不只是以一种非常普通的方式初始化:

vector < vector < Mat > > mat_vect2D;
for(int i = 0;i<vect_row;i++) {
    mat_vec2D.push_back(vector<Mat>());
    for(int j=0;j<vect_col;j++)
        mat_vec2D[i].push_back(Mat(mat_row, mat_col, CV_32S, Scalar::all(0)));
}

这将为2d向量的每个元素分配一个 Mat()的实例