2013-08-07 5 views
0

J'essaye de créer un tableau Mat en utilisant OpenCV. Le tableau est de stocker un numéro de N de la région d'intérêt, et pour chaque région, je dois stocker les informations des 5 dernières images. J'essaie d'utiliser un double pointeur vers Mat. La question est de savoir comment l'initialiser? J'essaie quelque chose comme ceci:Double pointeur d'initialisation Mat

Dans l'en-tête de la classe: Mat *Objs_avgwB[25];

et pour initialiser dans le fichier source: vseg.Objs_avgwB = new Mat[vseg.avgw][25];

+0

Ce n'est pas un pointeur double, mais un tableau de 25 pointeurs vers 'Mat' que vous avez déclaré. Vous pouvez faire quelque chose comme ceci 'Mat (* ptr) [25]' si vous êtes sûr d'avoir '25' éléments par' row'. –

Répondre

0

Au lieu de tourner autour avec des pointeurs et new, une meilleure option est d'utiliser les conteneurs fournis par la bibliothèque standard. Vous n'avez pas besoin de vous soucier de la façon exacte dont vous les initialiserez, car ils peuvent être redimensionnés dynamiquement.

Pour chaque ensemble de fonctions dans une trame, je créerais un std::vector de cv::Mat objets, un pour chaque région d'intérêt. Ensuite, utilisez un std::deque pour contenir les fonctionnalités de chaque image.

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

Sur chaque nouveau cadre, vous le feriez push_back chaque ROI sur le std::vector représentant tous les ROIs dans ce cadre:

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

vous puis pop hors du cadre le plus ancien et pousser les nouvelles données pour garder 5 images dans la file d'attente:

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

Vous pouvez ensuite accéder à chaque retour sur investissement dans l'histoire en utilisant operator[] par exemple, pour accéder à la quatrième ROI trouvé dans la trame précédente (n'oubliez pas l'indexation zéro!):

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

Oui, l'idée de conainers est une très bonne option, mais je ne vois pas comment je peux prendre en compte qu'il y a un nombre N de ROI pour lesquels j'ai 5 files d'attente. Je vois seulement un conteneur pour un seul retour sur investissement, ou pouvez-vous l'améliorer, comment puis-je accéder à chaque ROI? –

+0

C'était std :: deque, merci pour votre aide. –

0

Le pointeur que vous avez déclaré n'est pas un pointeur double(**) à Mat tableau.

Au lieu de cela vous pouvez faire cela,

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

qui déclare un pointeur Objs_avgwB à un Mat dont la première rangée a 25 éléments en elle. Vous pouvez l'utiliser si vous créez un tableau 2-D avec 25 éléments par ligne, car le type de retour de nouveau dans ce cas est Mat(*)[25].

De plus, n'oubliez pas d'appeler le delete[] à la fin.