2017-10-09 4 views
-1

Je travaille sur un programme dans lequel je devrais détecter des formes - cercles, carrés et traingles - et colorier chaque type avec des couleurs différentes. J'utilise cv2.findCountours, puis cv2.approxPolyDP pour détecter chaque forme.openCV: impossible de détecter correctement les formes à l'aide de findContours

Ceci est mon code:

import numpy as np 
import cv2 

img = cv2.imread('1.jpg') 
gray = cv2.imread('1.jpg',0) 

ret,thresh = cv2.threshold(gray,127,255,1) 

contours,h = cv2.findContours(thresh,cv2.RETR_CCOMP,cv2.CHAIN_APPROX_NONE) 

for cnt in contours: 
    approx = cv2.approxPolyDP(cnt, 0.03 * cv2.arcLength(cnt, True), True) 
    print len(approx) 
    if len(approx)==3: 
     print "triangle" 
     cv2.drawContours(img,[cnt],0,(122,212,78),-1) 
    elif len(approx)==4: 
     print "square" 
     cv2.drawContours(img,[cnt],0,(94,234,255),-1) 
    elif len(approx) == 8: 
     k = cv2.isContourConvex(approx) 
     if k: 
      cv2.drawContours(img, [cnt], 0, (220, 152, 91), -1) 


cv2.imshow('img',img) 
cv2.waitKey(0) 
cv2.destroyAllWindows() 

Il ne détecte les formes que je parlais, mais il détecte aussi bien des formes qui ne sont pas cercle/triangle/carré et les présente comme ils l'étaient.

Ceci est l'image je: 1

La sortie: 2

Toute suggestion comment résoudre ce problème? Quels examens puis-je ajouter?

Merci!

Répondre

1

Je vois que vous avez modifié votre code comme suggestion si le contrôle de convexité résout votre problème s'il vous plaît fermez la question précédente. Pour obtenir une réponse:

Utilisez différentes valeurs epsilon pour différentes formes. La valeur epsilon est de 0,03 dans votre code

approx = cv2.approxPolyDP(cnt, 0.03 * cv2.arcLength(cnt, True), True) 

Mais il peut changer par la résolution et la zone des contours de sorte que vous devriez essayer différentes valeurs epsilon pour différentes formes