2016-01-23 266 views
2

在C++中,我有以下代碼。我試圖將存儲在矢量中的數據複製到矩陣(在矢量內)。我試圖這樣做:將向量<float>中的數據複製到向量<Mat>(Opencv/C++)

Vector<float> vec; 
// Let's imagine that vec contains 10 float values: {1,2,3 ...., 10} 
// I'd like to copy those numbers into a Mat variable 
Vector<Mat> myMats; 
myMats.push_back(Mat(2,5,CV_32FC1,&vec.front())); 

它的工作原理。但是,當修改矢量「vec」上的內容並嘗試將其插入到我的向量Mat中的另一個位置時,它們都獲得最後一次「push_back」操作的值。 「myMats」中的所有條目都被最後一個條目覆蓋。我該如何解決這個問題?

我認爲問題是使用參考(「&」),每次修改地址,在哪裏看。

+0

你爲什麼推一個臨時對象的地址? –

+0

是的,只是編輯了我提到的問題。我第一次在這樣的情況下工作,然後我不得不修改代碼,但我不知道該怎麼做。 – karl71

+0

另外,我不清楚你想要做什麼。請描述現在正在發生的事情以及你想達到的目標。 –

回答

2

好的。我已經想通了如何做到這一點(創建一個臨時墊)

Mat temp_; 
temp_ = Mat(2,5,CV_32FC1,&vec.front()); 
myMats.push_back(temp_.clone()); 

我想有一個更有效的方式,但這個工程確定。

+1

如果可能,請接受您自己的答案。你必須克隆的原因是這個Mat構造函數只是使用數據指針而不是分配自己的內存。 – Micka

1

OP已經自己解決了。但是,如果稍後有人提出這個問題,這是一些澄清。

cv::Mat是一個帶有指向實際數據的指針的容器。當你創建一個cv::Mat這樣的:

cv::Mat some_mat; 

cv::Mat在堆棧中創建,它會通過保持一個指針在其結構指向堆中的數據。

cv::Mat another_mat=some_mat; 

或本:當你使用它的拷貝構造函數/賦值這樣複製cv::Mat

some_vector_of_mats.push_back(some_mat); 

淺拷貝會發生。換句話說,cv::Mat(行數和列數,類型...)的標題將被深度複製,並且指向實際數據的指針將被淺拷貝。但實際的數據不會被複制。所以在OP的情況下發生了什麼,每當一個cv :: Mat被推到這個向量時,一個淺拷貝就會發生。指針複製時其值不變。所以,所有的cv :: Mat都指向同一個地方。因此導致其中一個數據的任何變化都會影響其他數據。

相關問題