Détecter une croix dans une image avec OpenCV

J’essaie de détecter une forme (une croix) dans mon stream vidéo d’entrée avec l’aide d’ OpenCV . Actuellement, je suis seuil pour obtenir une image binary de ma croix qui fonctionne plutôt bien. Malheureusement, mon algorithme pour décider si le blob extrait est une croix ou non ne fonctionne pas très bien. Comme vous pouvez le voir sur l’image ci-dessous, tous les coins ne sont pas détectés sous certaines outlook.

Entrez la description de l'image ici

J’utilise findContours() et approxPolyDP() pour obtenir une approximation de mon contour. Si je détecte 12 coins / sumts dans cette courbe approchée, le blob est supposé être une croix.

Y a-t-il un meilleur moyen de résoudre ce problème? J’ai pensé à SIFT , mais l’algorithme doit fonctionner en temps réel et j’ai lu que SIFT n’est pas vraiment adapté au temps réel.

J’ai quelques suggestions qui pourraient donner des résultats intéressants, même si je ne suis pas certain non plus.

Si la croix est toujours près du centre de votre image et repose toujours sur une surface plane, vous pouvez essayer de trouver une homographie entre la caméra et le plan sur lequel se trouve la croix. Cela vous permettrait de transformer une image échantillon de la croix (à une sélection de différentes rotations dans le plan) en système de coordonnées de la croix visualisée. Vous pouvez ensuite générer des modèles que vous pouvez associer à l’image. Vous pouvez faire des tests simples d’accord de pixels pour déterminer si vous avez une correspondance.

Sinon, vous pouvez essayer de former un classificateur basé sur Haar pour reconnaître la croix. Ce type de classificateur est souvent utilisé dans la détection de visage et détecte les arêtes orientées dans les images, en classant les faces par les positions relatives de plusieurs arêtes orientées. Il a une bonne précision de classification sur les visages et est extrêmement rapide. Même si je ne peux pas garantir sa précision dans cette situation particulière, cela pourrait donner de bons résultats pour des formes simples telles que des croix.

Le calcul de la shell convexe et la mise à profit des défauts de convexité pourraient fonctionner.

Toutes les croix doivent avoir quatre défauts de convexité, constituant quatre séries de deux points ou quatre vecteurs. De plus, si votre forme était une croix, ces quatre vecteurs auront deux paires d’angles supplémentaires.