我正在尝试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_avgwBa的指针,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)