2013-08-07 33 views
0

我想用OpenCV創建一個Mat數組。該陣列將存儲感興趣區域的數字N,並且對於每個區域,我必須存儲最後5幀的信息。我試圖使用一個雙指針Mat。問題是我如何初始化它? 我想是這樣的:Mat初始化的雙指針

在類的頭:Mat *Objs_avgwB[25];

,並在源文件中初始化:vseg.Objs_avgwB = new Mat[vseg.avgw][25];

+0

它不是一個'double'指針,而是你指定的'Mat'的25個指針的數組。如果你確定每個「行」有25個元素,你可以像這樣做'Mat(* ptr)[25]'。 –

回答

0

更好的選擇是使用標準庫提供的容器,而不是使用指針和new。您不必擔心如何初始化它們,因爲它們可以動態調整大小。

對於框架中的每組要素,我會創建一個std::vectorcv::Mat對象,每個對象感興趣區域一個。然後,使用std::deque來保存每個幀的功能。

std::deque<std::vector<cv::Mat>> roi_history; 

在每一個新的框架,你會push_back每個ROI到std::vector代表該幀所有ROI:

std::vector<cv::Mat> new_rois; 
new_rois.push_back(roi1); 
new_rois.push_back(roi2); // Etc... 

你那麼流行過的最古老的框架和推新數據,以保持5幀隊列:

roi_history.pop_back(); 
roi_history.push_front(new_rois); 

然後,您可以通過使用operator[]例如訪問在歷史中的每個投資回報率,訪問中發現的第四ROI在前一幀(記住零索引!):

cv::Mat my_roi = roi_history[1][3]; 
//       ^^ 
//       | Fourth ROI 
//       | 
//       Most recent history (zero is current frame) 
+0

是的,conainers的想法是一個非常好的選擇,但是我不明白我怎麼能考慮到有N個我有5個幀隊列的投資回報率。我看到只有一個容器可用於單個投資回報率,或者您可以更好地擴大容量嗎?,我如何訪問每個投資回報率 –

+0

這就是它std :: deque,感謝您的幫助。 –

0

您已聲明的指針是不是double(**)指針Mat數組。

相反,你可以做到這一點,

Mat (*Objs_avgwB)[25] = new Mat[vseg.avgw][25]; 

它聲明的指針Objs_avgwBMat,其第一行中有25個元素。 如果要創建每行包含25個元素的2-D陣列,則可以使用此功能,因爲在這種情況下新建的返回類型爲Mat(*)[25]

此外,不要忘記在最後撥打delete[]