2014-01-26 91 views
3

對於我在C++中的當前項目,我需要一個2D向量,其中包含opencv:Mat矩陣作爲元素。 我發現了一個類似的例子,這產生雙端的2D向量,其工作完全正常:如何初始化包含opencv:矩陣的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結構所取代。

回答

2

我認爲這個問題是您使用填充構造

明確的矢量(SIZE_TYPE N,常量VALUE_TYPE & VAL = VALUE_TYPE(), 常量allocator_type &的alloc = allocator_type());

構造一個具有n個元素的容器。每個元素 是val的副本。

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

所以你相同的附圖中的每個元件的2D初始化到一個墊()對象。 在上面的例子中它的作品,因爲你只存儲整數作爲值...

爲什麼你不只是初始化一個很普通的方法:

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向量的每個元素a 新增 Mat實例()