Naviguer dans la hiérarchie des contours trouvés par la méthode FindContours?

Cela doit être simple pour les développeurs C ++ utilisant OpenCV directement. Cependant, ce que j’utilise, c’est Emgu (un wrapper OpenCV pour .NET). Dans la dernière version, nous avons la méthode CvInvoke.FindContours renvoie void, le résultat de la sortie est passé par référence au paramètre et est de type VectorOfVectorOfPoint .

Voici un appel simple:

 //outputResult is a VectorOfVectorOfPoint CvInvoke.FindContours(inputImage, outputResult, null, RetrType.Tree, ChainApproxMethod.ChainApproxSimple); 

Pour le mode RetrType.List , nous pouvons simplement convertir le résultat en un tableau de tableaux et parcourir facilement tous les contours. Cependant, ici, j’aimerais naviguer à travers tous les contours d’un arbre. Je suppose que nous devons faire quelque chose avec du code C ++ natif (non sécurisé) ici avec un pointeur (accessible via la propriété Ptr du résultat de la sortie). Mais je me demande s’il existe une solution plus conviviale pour cela .NET. Et si même l’utilisation du pointeur est la seule solution, je ne sais toujours pas comment approfondir ce Ptr pour naviguer dans l’arborescence des contours.

Les exemples de codes accompagnant l’installation d’Emgu ont un extrait utilisant CvInvoke.FindContourTree place (et qui renvoie un int[,] ).

Pour obtenir la hiérarchie des contours, vous devez d’abord transmettre un object Mat à la fonction:

 Mat hierarchy = new Mat() ; CvInvoke.FindContours(inputImage, outputResult, hierarchy, RetrType.Tree, ChainApproxMethod.ChainApproxSimple); 

Vous pouvez ensuite utiliser l’object hierarchy comme suit (voir ici pour plus de détails dans Python OpenCV):

hierarchy sera un object Mat de taille 1 x taille de outputResult x 4. Donc, pour le contour d’indice i :

  • hierachy[0,i,0] est l’index du prochain contour au même niveau hiérarchique (avec le même parent) ou – 1 s’il n’existe pas
  • hierachy[0,i,1] est l’index du contour précédent au même niveau hiérarchique ou – 1 s’il n’existe pas
  • hierachy[0,i,2] est l’indice de l’enfant du contour i ou – 1 s’il n’existe pas
  • hierachy[0,i,3] est l’index du parent du contour i ou – 1 s’il n’existe pas

C’est comme ça que vous utilisez l’object hierarchy.

Les contours eux-mêmes sont accessibles via l’object outputResult en utilisant leurs index.