python opencv - goutte de la détection ou de cercle de détection
J'ai des problèmes de détection de cercle domaines.
Je l'ai essayé avec le HoughCircles fonction de opencv. Cependant, même si les images sont assez similaires, les paramètres de la fonction doivent être différentes afin de détecter la cirles.
Une autre approche que j'ai essayé était pour itérer sur chaque pixel et de vérifier si le pixel est blanc.
Si c'est le cas, alors vérifier si il y a un objet blob dans la zone (distance à goutte centre plus petit qu'un seuil). Si il y est, ajouter le pixel à la goutte, si pas, puis créer un nouveau blob.
Cela aussi n'a pas fonctionné correctement.
Quelqu'un a une idée de comment je peux faire ce travail (90% de détection) ?
J'ai joint un exemple d'image et une autre image où j'ai marqué le cirles.
Merci!
Mise à JOUR:
Merci pour l'aide pour l'instant!
C'est le code où j'acquérir les contours et les filtrer par zone:
im = cv2.imread('extract_blue.jpg')
imgray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
im_gauss = cv2.GaussianBlur(imgray, (5, 5), 0)
ret, thresh = cv2.threshold(im_gauss, 127, 255, 0)
# get contours
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
contours_area = []
# calculate area and filter into new array
for con in contours:
area = cv2.contourArea(con)
if 1000 < area < 10000:
contours_area.append(con)
Cela fonctionne très soigné. J'ai dessiné sur l'image:
C'est la partie où j'ai filtré par la circularité, il va directement ci-dessous le code où je filtre par région:
contours_cirles = []
# check if contour is of circular shape
for con in contours_area:
perimeter = cv2.arcLength(con, True)
area = cv2.contourArea(con)
if perimeter == 0:
break
circularity = 4*math.pi*(area/perimeter*perimeter)
print circularity
if 0.8 < circularity < 1.2:
contours_cirles.append(con)
Cependant, la nouvelle liste "contours_cirles' est vide. J'ai imprimé la "circularité" dans la boucle et les valeurs sont toutes entre 10 000 et 100 000.
Mise à JOUR #2:
Après la correction de l'manquant crochets, elle travaille maintenant!
contours_cirles = []
# check if contour is of circular shape
for con in contours_area:
perimeter = cv2.arcLength(con, True)
area = cv2.contourArea(con)
if perimeter == 0:
break
circularity = 4*math.pi*(area/(perimeter*perimeter))
print circularity
if 0.7 < circularity < 1.2:
contours_cirles.append(con)
Merci beaucoup les gars! 🙂
(area/perimeter*perimeter)
ce qui semble étrange pour moi. Etes-vous sûr que vous n'avez pas oubliez l'un des crochets ?oui, vous avez raison. la circularité = 4*math.pi*(zone/(périmètre*périmètre))
c'est le travail!
Beau travail. Je dois essayer cela aussi. 😀
OriginalL'auteur cmplx96 | 2017-02-13
Vous devez vous connecter pour publier un commentaire.
Comme un point de départ, vous pouvez commencer avec:
Vous devriez essayer de mettre en œuvre cette approche et de mise à jour de la question avec le code que vous écrivez désormais.
EDIT:
Comme suggéré par @Miki, il est mieux et plus propre façon de détecter si une forme géométrique est de forme circulaire à l'aide de circularité = 4pi(aire/périmètre^2), et de décider d'un seuil tel que 0.9, pour vérifier si la forme est circulaire. Perfect circle
circularity == 1
. Vous pouvez affiner ce seuil en fonction de vos besoins.Vous pouvez consulter arcLength pour trouver le périmètre du contour et contourArea obtenir la zone de contour qui sont nécessaires au calcul de la circularité.
Merci beaucoup @Miki
OriginalL'auteur ZdaR
Nous pourrions essayer
Hough Transformation
trop pour détecter les cercles à l'image et à jouer avec les seuils pour obtenir le résultat souhaité (détecté dans les cercles en vert les lignes de démarcation avec des points rouges comme des centres):OriginalL'auteur Sandipan Dey