2015-06-12 17 views
9

Ho seguito un esempio di rilevamento BLOB (utilizzando cv2.SimpleBlobDetector) e rilevato correttamente i BLOB nella mia immagine binaria. Ma poi non so come estrarre le coordinate e l'area dei punti chiave. Ecco il codice per le rilevazioni blob:OpenCV restituisce le coordinate e l'area dei punti chiave dal rilevamento blob, Python

# I skipped the parameter setting part. 
    blobParams = cv2.SimpleBlobDetector_Params() 
    blobVer = (cv2.__version__).split('.') 
    if int(blobVer[0]) < 3: 
     detector = cv2.SimpleBlobDetector(blobParams) 
    else: 
     detector = cv2.SimpleBlobDetector_create(blobParams) 

    # Detect Blobs 
    keypoints_black = detector.detect(255-black_blob) 
    trans_blobs = cv2.drawKeypoints(gray_video_crop, \ 
     keypoints_white, np.array([]), (0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) 

Quindi la variabile keypoints_black contiene le informazioni del blob (s). Quando ho stampato la variabile sembrava qualcosa di simile (2 blob sono stati trovati):

KeyPoint 0x10b10b870, KeyPoint 0x10b1301b0 

Così come ottengo le coordinate del centro di massa dei punti chiave e la loro area in modo che io possa inviarli come osc messaggi per l'interazione.

+0

Provare a stampare 'dir (keypoint)' dove 'keypoint è ovviamente un punto chiave :) Questo dovrebbe fornire un elenco di metodi. Inoltre, puoi provare a 'tupla (keypoint)' per vedere se è convertibile. – deets

+0

Ho provato tupla (keypoint) ha restituito lo stesso, solo in tupla piuttosto che array. –

+0

E il dir (punto chiave) ha restituito una Buch di metodi: [ '__delattr__', '__delitem__', \t \t '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', \t \t # '__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', \t \t # '__ init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__ ', '__ne__', \t \t # '__ new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', \t \t # '__ setattr__', '__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__', \t \t # 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse',]. Ma non so quale sia il prossimo –

risposta

8

Il pt proprietà:

keypoints = detector.detect(frame) #list of blobs keypoints 
x = keypoints[i].pt[0] #i is the index of the blob you want to get the position 
y = keypoints[i].pt[1] 

Some documentation

+1

Brillante. Grazie!! –

+0

Grazie per il link alla documentazione! – johndodo

8

Se si dispone di un elenco di punti chiave. Quindi è possibile stampare come mostrato di seguito

for keyPoint in keyPoints: 
    x = keyPoint.pt[0] 
    y = keyPoint.pt[1] 
    s = keyPoint.size 

Modifica: dimensione determina il diametro del quartiere dei punti chiave significativo. È possibile utilizzare tale dimensione e calcolare approssimativamente l'area del blob.

+1

L'attributo '.size' è il diametro del blob, non la sua area. – Delgan

+0

@Delgan No dove ho detto ".size" significa area nella mia risposta. Per favore leggilo correttamente. –

+2

Lo stai dicendo implicitamente, poiché l'autore ha chiesto "come ottenere le coordinate del centro di massa dei punti chiave e della loro area". Chiunque legga la tua risposta ne dedurrà erroneamente che '.size' restituisce l'area del blob. – Delgan

Problemi correlati