Mat初始化的双指针

Double pointer of Mat initialization

本文关键字:指针 初始化 Mat      更新时间:2023-10-16

我正在尝试使用OpenCV制作一个Mat数组。该阵列将存储感兴趣区域的数量N,并且对于每个区域,我必须存储最后5帧的信息。我正在尝试使用指向Mat的双指针。问题是我该如何初始化它?我正在尝试这样的东西:

在类的标题中:Mat *Objs_avgwB[25];

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

与其摆弄指针和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。例如,要访问前一帧中的第四个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[]