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