Reconnaître ouvert et fermé formes d'opencv
comment détecter ouvert et fermé formes dans opencv.
Ce sont de simples formes, je veux détecter. J'ai détecté un rectangle à l'aide findContours
et approxPolyDP
et que la vérification de l'angle entre les vecteurs.
Maintenant, je veux détecter la forme ouverte, approxPolyDP
fonction bool pour la forme fermée est défini à true, et il y a aussi une case pour isCounterConvex
sur les points retourné, plus contourArea
limitation.
Des idées comment dois-je aller sur la détection des images de ce genre.
OriginalL'auteur Fahad Malik | 2014-03-07
Vous devez vous connecter pour publier un commentaire.
Suffit d'utiliser findContours() dans votre image, puis de décider si le contour est fermé ou non par l'examen de la hiérarchie passé à la findContours() fonction. À partir de la deuxième figure, il est plus clair qu'aucun contour a enfant de contour par rapport à la première image, vous allez obtenir ces données auprès de la hiérarchie paramètre est facultatif vecteur de sortie, contenant des informations sur l'image de la topologie. Il a autant d'éléments que le nombre de contours.
Ici, nous allons utiliser la hiérarchie comme
où, pour un i-ème contour
Si pour le contour j'ai il n'y a pas suivant, précédent, un parent, ou imbriqués les contours, les éléments correspondants de
hierarchy[i]
sera négatif. Voir findContours() fonction pour plus de détails.Donc en vérifiant la valeur
hierarchy[i][2]
vous pouvez décider d'un contour appartient à fermé ou pas, c'est pour un contour si lehierarchy[i][2] = -1
alors pas d'enfant et il appartient à ouvert.Et encore une chose, c'est que dans findContours() fonction que vous devriez utiliser CV_RETR_CCOMP qui récupère tous les contours et les organise en une hiérarchie à deux niveaux.
Voici le code C++ comment le mettre en œuvre.
Résultat:
OriginalL'auteur Haris
Alors que correcte pour le problème posé, @Haris réponse utile ne doit pas être pris comme une solution générale pour l'identification des contours fermés à l'aide de findContours().
L'une des raisons est qu'un objet rempli aura pas de contour interne et qui seraient donc de retour
hierarchy[i][2] = -1
, ce qui signifie que ce test sur son propre aurait tort étiquette contours de l' "ouvrir".Le contour d'un objet rempli devraient pas avoir d'enfant ou d'un parent dans le contour de la hiérarchie, c'est à dire être au top niveau. Donc, afin de détecter des contours fermés d'objets remplis aurait au moins exiger un test supplémentaire:
if(hierarchy[i][2] < 0 && hierarchy[i][3] < 0)
.Je pense que @Haris réponse peut-ont fait de ce point de obliquement, mais j'ai pensé qu'il vaut mieux clarifier pour les personnes qui, comme moi, qui sont d'apprendre à utiliser opencv.
OriginalL'auteur fink-nottle
La réponse dépend de votre image, plus précisément, combien de contours sont prédéfinis, il y a d'autres objets, le bruit, etc. Dans un cas simple d'un seul contour de remplissage a commencé à l'intérieur du contour fermé de ne pas déborder sur l'ensemble de l'image; si on commence à l'extérieur, il ne sera pas obtenir dans le milieu. Afin de vous préserver une certaine zone blanche dans les deux cas.
OriginalL'auteur Vlad