Je dois connecter les contours voisins dans une image en fonction de la distance entre eux qui spécifie si les contours doivent être connectés.
Maintenant, il y a déjà une question sur le même problème ici /programming/8973017/opencv-c-obj-c-connect-nearby-contours mais ici, il fusionne tous les contours en un seul. Ça, je ne veux pas. Je ne pense pas qu'il y ait une fonction dans opencv pour cela, mais vous pouvez suggérer un algorithme pour cela. Ma candidature se présente comme suit:
Je détecte des mains, j'ai donc utilisé un algorithme de détection de la peau pour les déterminer, mais comme ma peau n'est pas blanche et peut-être à cause des conditions d'éclaircissement, parfois le contour se brise au niveau du coude. Je veux donc que les contours voisins soient connectés, mais pas tous (parce que mes deux mains seront là dans les contours.) (Par mains, je veux dire de l'épaule à la paume.)
De plus, je pense qu'en utilisant une détection de bord, je vais obtenir mes limites de mains et détecter si une partie de ce patch à l'intérieur de cette limite est détectée comme peau, alors toute la région à l'intérieur de cette limite sera détectée comme peau, mais je ne sais pas comment le faire partie.
Toute aide serait appréciée. Merci d'avance
Exemple d'image:
Dans cette image, je veux connecter des points (8 connectivités) qui sont inférieurs à 40 pixels de distance pour que je prenne ma main gauche comme un contour unique
Mon objectif est d'obtenir uniquement le contour de la main (je ne me soucie d'aucune autre région)
Réponses:
Si vous n'êtes pas inquiet de la vitesse ou du contour exact de la main, voici une solution simple.
La méthode est la suivante: vous prenez chaque contour et trouvez la distance par rapport aux autres contours. Si la distance est inférieure à 50, ils sont à proximité et vous les mettez ensemble. Sinon, ils sont mis comme différents.
La vérification de la distance à chaque contour est donc un processus long. Prend quelques secondes. Vous ne pouvez donc pas le faire en temps réel.
De plus, pour joindre les contours, je les ai mis dans un seul ensemble et j'ai dessiné une coque convexe pour cet ensemble. Ainsi, le résultat que vous obtenez est en fait une coque de main convexe, pas une vraie main.
Ci-dessous mon morceau de code en OpenCV-Python. Je n'ai opté pour aucune optimisation, je voulais juste que ça marche, c'est tout. Si cela résout votre problème, optez pour l'optimisation.
Voici les résultats que j'ai obtenus:
la source
Pour résoudre le problème de connectivité, vous pouvez essayer une opération de fermeture:
Je doute que cela produise les résultats que vous souhaitez, mais vous pouvez l'essayer.
la source
Il semble que vous «surzégiez» votre image. Les opérations morphologiques, comme l'a suggéré bjnoernz, seraient utiles. En particulier, une approche par bassin versant devrait se rapprocher de ce que vous voulez plutôt que de simplement vérifier la distance (comme dans l'exemple python ci-dessus). Voir http://cmm.ensmp.fr/~beucher/wtshed.html .
la source