42 votes

Détecter une croix dans une image avec OpenCV

Je suis en train de détecter une forme (une croix) dans mon entrée de flux vidéo avec l'aide d' OpenCV. Actuellement, je suis un seuillage pour obtenir une image binaire de ma croix qui fonctionne plutôt bien. Malheureusement, mon algorithme pour décider si l'extrait blob est une croix ou pas n'est pas très bonne. Comme vous pouvez le voir dans l'image ci-dessous, pas à tous les coins sont détectés sous certains points de vue.

Enter image description here

Je suis à l'aide d' findContours() et approxPolyDP() pour obtenir une approximation de mon contour. Si je suis la détection de 12 corners / sommets dans cette courbe approximative, le blob est supposé être une croix.

Est-il une meilleure façon de résoudre ce problème? J'ai pensé à TAMISER, mais l'algorithme doit effectuer en temps réel, et j'ai lu que EIPD n'est pas vraiment adapté pour le temps réel.

9voto

Max Points 868

J'ai un couple de suggestions qui pourraient fournir des résultats intéressants même si je ne suis pas certain de soit.

Si la croix est toujours au centre de votre image et se trouve toujours sur une surface plane, vous pouvez essayer de trouver une homographie entre la caméra et le plan sur lequel la croix se trouve. Cela vous permet de transformer une image de l'échantillon de la croix (à une sélection de différents dans les rotations dans le plan) pour le système de coordonnées de la visualisées croix. Vous pouvez ensuite générer des modèles qui pourraient correspondre à l'image. Vous pourriez faire un simple pixel de l'accord de tests pour déterminer si vous avez une correspondance.

Sinon, vous pouvez essayer de former un Haar à base de classificateur de reconnaître la croix. Ce type de classificateur est souvent utilisé dans la détection de visage et détecte orientée vers les bords de l'image, la classification des visages par les positions relatives de plusieurs orientée vers les bords. Il a une bonne précision de la classification sur les visages et est extrêmement rapide. Bien que je ne peux pas se porter garant de son exactitude dans cette situation particulière, il peut fournir de bons résultats pour des formes simples comme une croix.

8voto

David Wurtz Points 185

Le calcul de l' enveloppe convexe puis en prenant l'avantage de la convexité des défauts pourrait fonctionner.

Tous les croisements doit avoir quatre convexité de défauts, de faire jusqu'à quatre ensembles de deux points, soit quatre vecteurs. En outre, si votre forme est une croix puis ces quatre vecteurs ont deux paires d'angles supplémentaires.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X