如何初始化包含 opencv:matrices 的二维向量?

Posted

技术标签:

【中文标题】如何初始化包含 opencv:matrices 的二维向量?【英文标题】:How to initialize a 2D vector containing opencv:matrices? 【发布时间】:2014-01-26 15:37:30 【问题描述】:

对于我当前的 c++ 项目,我需要一个 2D 向量,其中包含 opencv:Mat 矩阵作为元素。 我找到了一个类似的例子,它创建了一个二维向量的双端队列,效果很好:

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】:

我认为问题在于你使用了 fill 构造函数

显式向量 (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() 对象。 在上面的示例中,它之所以有效,是因为您仅将整数存储为值...

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

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

【讨论】:

以上是关于如何初始化包含 opencv:matrices 的二维向量?的主要内容,如果未能解决你的问题,请参考以下文章

如何将包含 SysV 初始化脚本的 RPM 包移植到 systemd?

如果名称包含点,如何在 dataTables 列初始化中获取 JSON 对象值?

c ++如何创建包含未初始化字节大小的std :: string?

如何将 NSURLRequest 的结果传递回包含类 [重复]

如何填充包含未知大小的结构切片的结构[重复]

如何将自定义结构插入另一个包含初始结构的二维指针的结构中?