Je rencontre des problèmes pour détecter des zones de cercle. Je l'ai essayé avec la fonction HoughCircles d'opencv. Cependant, même si les images sont assez similaires, les paramètres de la fonction doivent être différents afin de détecter les cirles.python opencv - détection de blobs ou détection de cercle
Une autre approche que j'ai essayée était d'itérer sur chaque pixel et de vérifier si le pixel courant est blanc. Si c'est le cas, vérifiez s'il y a un objet blob dans la zone (distance au centre de blob inférieure à un seuil). Si c'est le cas, ajoutez le pixel au blob, sinon créez un nouveau blob. Cela n'a pas fonctionné correctement.
Quelqu'un at-il une idée de comment je peux faire ce travail (détection de 90%)? J'ai joint une image d'exemple et une autre image où j'ai marqué les cirles. Merci!
MISE À JOUR: Nous vous remercions de l'aide à ce jour! Ce est le code où je les contours et acquiers les filtrer par région:
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 assez propre. Je les ai dessiné sur l'image:
Ceci est la partie où je Filtré par circularité, il va directement en dessous du code où je filtre par zone:
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é « circularité » dans la boucle et les valeurs sont tous entre 10 000 et 100 000.
MISE À JOUR # 2: Après avoir corrigé les supports manquants, il 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! :)
Très ancien code. Mais vous pouvez vérifier cela. https://github.com/bipul21/Colored-Ball-Tracking –
'(zone/périmètre * périmètre)' cela me semble étrange. Etes-vous sûr, vous n'avez pas oublié les crochets? – Moritz
oui, vous avez raison. circularity = 4 * math.pi * (zone/(périmètre * périmètre)) – cmplx96