如何初始化一个包含OpenCV矩阵的二维向量?

3

我目前在c++项目中需要一个包含opencv:Mat矩阵的2D向量。我找到了一个类似的示例,可以创建一个deque的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)));

然而,将其用于矩阵的二维向量并不会创建独立的矩阵,更改一个矩阵会导致更改二维向量中的每个元素。看起来只有一个矩阵存在。

// 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]
(...)

是的,我需要将矩阵作为二维向量中的元素,因为这些矩阵将作为另一个算法的输入(使用其他数据类型将意味着需要进行大量转换)。因此,我更喜欢使用矩阵作为元素的解决方案,但向量可以被任何其他二维结构替换。

1个回答

2
我认为问题在于您使用了一个“填充构造函数”:

explicit vector (size_type n, const value_type& val = value_type(), const allocator_type& alloc = allocator_type());

用n个元素构造容器。每个元素都是val的副本。

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

因此,您将每个2D元素初始化为指向Mat()对象的同一引用。在上面的示例中,它能够工作,因为您仅存储int作为值...

为什么不采用相当普通的初始化方式:

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()实例

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接