OpenCV – SimpleBlobDetector

SimpleBlobDetector est un utilitaire d’OpenCV permettant la détection automatique des “Blobs”. en Anglais un Blob est une tache . cet utilitaire est donc intéressant pour la détection de formes basiques circulaires, elliptiques ou rectangulaire. il trouve son intérêt par exemple en astronomie pour la détection d’étoiles sur un ciel noir avec une camera.

pour illustrer , ses possibilités , commençons par un programme simple utilisant une camera USB et une feuille blanche avec quelques taches faites au marqueur noir.

import numpy as np
import cv2
cap = cv2.VideoCapture(0)

while (True):
    ret, frame = cap.read()
    # entrée des parametres de SimpleBlobDetector
    params = cv2.SimpleBlobDetector_Params()    
    params.minThreshold = 10;     # Change thresholds
    params.maxThreshold = 300; 
    params.filterByColor = False    # Filter by color.
    params.BlobColor = 0   # 0 for darkcolor & 255 for light colors   
    params.filterByArea = True    # Filter by Area.
    params.minArea = 200
    params.maxArea = 600    
    params.filterByCircularity = False   # Filter by Circularity
    params.minCircularity = 0.1
    params.maxCircularity = 1    
    params.filterByConvexity = False    # Filter by Convexity
    params.minConvexity = 0.87
    params.maxConvexity = 2    
    params.filterByInertia = False     # Filter by Inertia
    params.minInertiaRatio = 0.01
    params.maxInertiaRatio = 0.1
    # utilisation de SimpleBlobDetector
    detector = cv2.SimpleBlobDetector_create(params)
    keypoints = detector.detect(frame)
    im_with_keypoints = cv2.drawKeypoints(frame, keypoints, np.array([]), (0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
    cv2.imshow('frame', im_with_keypoints)
    
    if cv2.waitKey(1) == 27:
        break

voici le resultat avec les parametres saisis.

toutes les taches faites au feutre ne sont pas entourées , c’est tout simplement le resultat de la definition des lignes de filtre ci dessous qui fixent la taille mini et maxi des zone de pixels a choisir ( entre 200 et 600 pixels):

 params.filterByArea = True    # Filter by Area.
    params.minArea = 200
    params.maxArea = 600    

on active les differents type de filtre en mettant la valeur a ” True” ( pour desactiver , il faut mettre “False“) et en choisissant une valeur pour les 2 lignes de seuils mini et maxi.

pour illustrer la fonction de chaque filtre , ci dessous une petite image de synthese:

nous allons maintenant sur le meme principe , determiner les coordonnées d’une tache blanche sur une feuille sombre . voici le programme:

import numpy as np
import cv2
cap = cv2.VideoCapture(0)

while (True):
    ret, frame = cap.read()    
    params = cv2.SimpleBlobDetector_Params()    
    params.minThreshold = 10;     
    params.maxThreshold = 300;
    params.filterByColor = True   
    params.blobColor = 255  
    params.filterByArea = True   
    params.minArea = 100
    params.maxArea = 600 
    detector = cv2.SimpleBlobDetector_create(params)
    keypoints = detector.detect(frame)    
    im_with_keypoints = cv2.drawKeypoints(frame, keypoints, np.array([]), (0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)    
    cv2.imshow('frame', im_with_keypoints)
    for kp in keypoints:
     print (int(kp.pt[0]), int(kp.pt[1]))
    
    if cv2.waitKey(1) == 27:
        break

l’evolution majeure par rapport au premier programme , est l’activation du mode couleur et la prise en compte de couleurs lumineuses ( ici la tache blanche sur fond sombre) dans les 2 lignes en rouge. et l’ajout d’une boucle imprimant les coordonnées (en pixel de l’image) dans les 2 lignes bleues. si on fait tourner ce programme dans thonny python , et que l’on fait bouger l’image ou la camera voici 2 exemples du resultat ( a gauche les coordonnées qui s’affichent dans la fenêtre shell de thonny python):

nous avons ici les bases d’un programme python pour de l’autoguidage sur une monture équatoriale astronomique… ne reste qu’a transformer ces coordonnées “pixels” en deplacements AD/DEC au fur et a mesure du déplacement de l’étoile de référence dans l’image ….