2017-02-14 2 views
1

Pour un projet scolaire, j'essaie de reconnaître une forme hexagonale dans une capture vidéo en utilisant python et opencv. Le problème est que lorsque j'utilise ce code, il ne trouve jamais un hexagone. Je n'ai pas trouvé de raison pour laquelle ça ne marche pas alors j'espère que quelqu'un pourra m'aider.Détection de forme python opencv

Le code:

import numpy as np 
import cv2 

stop_cascade = cv2.CascadeClassifier('cascade.xml') 

cap = cv2.VideoCapture(0) 

while(True): 
    ret, img = cap.read() 
    lower = np.array([0,0,0]) 
    upper = np.array([20,20,20]) 
    mask = cv2.inRange(img, lower, upper) 
    contours, h = cv2.findContours(mask, 1, 2) 
    contours.sort(key = len) 

    for contour in contours[-3:]: 
     approx = cv2.approxPolyDP(contour,0.1*cv2.arcLength(contour,True),True) 
     if len(approx) == 6: 
      print "hexagon" 

    cv2.imshow('image', mask) 

    if cv2.waitKey(1) & 0xFF == ord('q'): 
     break 

cap.release() 
cv2.destroyAllWindows() 

Merci à l'avance

Edit: Pour être un peu plus précis. J'ai essayé plusieurs hexagones différents mais quand j'imprime le len (environ) il n'est jamais plus haut que 4. Est-ce une faute dans mon objet ou est-ce que j'ai une erreur dans la recherche des contours que je ne connais pas?

+0

Qu'avez-vous fait pour réellement déboguer votre programme, au lieu de dire "Je n'ai pas trouvé de raison pour que ça ne marche pas alors j'espère que quelqu'un pourra m'aider?" S'il vous plaît, posez une question * spécifique *, pas "veuillez corriger ceci ..." – blacksite

+0

Je suis désolé de ne pas être suffisamment précis. Ce que j'ai fait pour déboguer le code est de tenir des formes hexagonales différentes devant la caméra, alors que le programme a imprimé la len (approx) mais il n'a jamais montré un nombre supérieur à 4. J'ai ce problème à cause de mes objets (un hexon image en forme sur papier) ou est-ce que je me trompe dans la recherche des contours? – Nerdeose

+0

Pouvez-vous joindre l'entrée d'échantillon? – ZdaR

Répondre

0

On dirait que votre programme simplifie le contour au-delà de ce que vous souhaitez. Donc, approxPolyDP simplifie encore plus votre hexagone à un carré ou un triangle. Cela expliquerait également pourquoi len (environ) ne renvoie jamais une valeur supérieure à 4. Essayez de changer la valeur de epsilon que vous passez à approxPolyDP. Ce sont les changements que je suggère:

  1. Essayez une plage de valeurs pour epsilon dans approxPolyDP. Modifier le facteur de multiplication dans 0.1*cv2.arcLength(contour,True) de 0,01 à 0,1
  2. utilisation drawContours pour afficher effectivement la courbe environ. Cela vous aidera à choisir le meilleur facteur de multiplication

Une autre approche utilise la coque convexe de l'hexagone plutôt que le contour, puis appliquer la approxPolyDP fonction. Idéalement, si votre image est suffisamment nette, il suffit de vérifier le nombre de points dans la coque convexe pour savoir si la forme est un hexagone ou non. Simplifier la coque plus loin devrait vous aider à être plus robuste aux images bruyantes. Mais encore une fois choisir le bon facteur de multiplication sera important.