我正在尝试使用OpenCV制作一个Mat
数组。该阵列将存储感兴趣区域的数量N
,并且对于每个区域,我必须存储最后5帧的信息。我正在尝试使用指向Mat
的双指针。问题是我该如何初始化它?我正在尝试这样的东西:
在类的标题中:Mat *Objs_avgwB[25];
并在源文件中初始化:vseg.Objs_avgwB = new Mat[vseg.avgw][25];
与其摆弄指针和new
,更好的选择是使用标准库提供的容器。您不需要担心如何初始化它们,因为它们可以动态调整大小。
对于帧中的每组特征,我将创建一个std::vector
的cv::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。例如,要访问前一帧中的第四个ROI(记住零索引!):
cv::Mat my_roi = roi_history[1][3];
// ^ ^
// | Fourth ROI
// |
// Most recent history (zero is current frame)
您声明的指针不是指向Mat
数组的double(**)
指针。
相反,你可以这样做,
Mat (*Objs_avgwB)[25] = new Mat[vseg.avgw][25];
其声明指向第一行中具有25个元素的CCD_ 16的指针CCD_。如果您要创建一个每行有25个元素的2-D数组,则可以使用此方法,因为在这种情况下,new的返回类型是Mat(*)[25]
。
另外,不要忘记在最后调用delete[]
。