2012-05-23 15 views
11

Ho letto sull'argomento ma non riesco a ottenere l'idea in "inglese semplice" sull'utilizzo e i parametri per HoughCircles (in particolare quelli dopo CV_HOUGH_GRADIENT).Quali sono i valori di utilizzo/parametro corretti per HoughCircles in OpenCV per il rilevamento dell'iride?

Cos'è una soglia di accumulatore? Sono 100 "voti" un giusto valore?

Sono riuscito a trovare e "mascherare" l'alunno, e mi sono fatto strada attraverso la funzione Canny, ma mi sto sforzando oltre e il mio problema è la funzione HoughCircles. Sembra che non riesca a trovare il cerchio di Iris e non so perché.

This is what I have so far. LEFT: masked pupil RIGHT: canny result

E questa è la funzione su cui sto lavorando:

def getRadius(area): 
    r = 1.0 
    r = math.sqrt(area/3.14) 
    return (r) 

def getIris(frame): 
    grayImg = cv.CreateImage(cv.GetSize(frame), 8, 1) 
    cv.CvtColor(frame,grayImg,cv.CV_BGR2GRAY) 
    cv.Smooth(grayImg,grayImg,cv.CV_GAUSSIAN,9,9) 
    cv.Canny(grayImg, grayImg, 32, 2) 
    storage = cv.CreateMat(grayImg.width, 1, cv.CV_32FC3) 
    minRad = int(getRadius(pupilArea)) 
    circles = cv.HoughCircles(grayImg, storage, cv.CV_HOUGH_GRADIENT, 2, 10,32,200,minRad, minRad*2) 
    cv.ShowImage("output", grayImg) 
    while circles: 
     cv.DrawContours(frame, circles, (0,0,0), (0,0,0), 2) 
     # this message is never shown, therefore I'm not detecting circles 
     print "circle!" 
     circles = circles.h_next() 
    return (frame) 

risposta

15

HoughCircles può essere un po 'difficile, suggerisco di guardare attraverso this thread. Dove un gruppo di persone, incluso me;), discute come usarlo. Il parametro chiave è param2, il cosiddetto accumulator threshold. Fondamentalmente, più alto è il numero di cerchi che ottieni. E questi cerchi hanno una maggiore probabilità di essere corretti. Il miglior valore è diverso per ogni immagine. Penso che l'approccio migliore sia utilizzare una ricerca parametri su param2. Vale a dire. continua a provare i valori fino a quando i tuoi criteri non sono soddisfatti (ad esempio: ci sono 2 cerchi, o il numero massimo di cerchi che non si sovrappongono, ecc.). Ho del codice che fa una ricerca binaria su "param2", quindi soddisfa rapidamente i criteri.

L'altro fattore cruciale è la pre-elaborazione, cercare di ridurre il rumore e semplificare l'immagine. Una combinazione di sfocatura/soglia/canny è buona per questo.

Comunque, ottengo questo:

enter image description here

dall'immagine uploded, utilizzando questo codice:

import cv 
import numpy as np 

def draw_circles(storage, output): 
    circles = np.asarray(storage) 
    for circle in circles: 
     Radius, x, y = int(circle[0][3]), int(circle[0][0]), int(circle[0][4]) 
     cv.Circle(output, (x, y), 1, cv.CV_RGB(0, 255, 0), -1, 8, 0) 
     cv.Circle(output, (x, y), Radius, cv.CV_RGB(255, 0, 0), 3, 8, 0)  

orig = cv.LoadImage('eyez.png') 
processed = cv.LoadImage('eyez.png',cv.CV_LOAD_IMAGE_GRAYSCALE) 
storage = cv.CreateMat(orig.width, 1, cv.CV_32FC3) 
#use canny, as HoughCircles seems to prefer ring like circles to filled ones. 
cv.Canny(processed, processed, 5, 70, 3) 
#smooth to reduce noise a bit more 
cv.Smooth(processed, processed, cv.CV_GAUSSIAN, 7, 7) 

cv.HoughCircles(processed, storage, cv.CV_HOUGH_GRADIENT, 2, 32.0, 30, 550) 
draw_circles(storage, orig) 

cv.ShowImage("original with circles", orig) 
cv.WaitKey(0) 

Aggiornamento

mi rendo conto che un po 'miss-letto la tua domanda! In realtà si desidera trovare i bordi iris. Non sono così chiaramente definiti, come gli alunni. Quindi dobbiamo aiutare il più possibile a HoughCircles. Possiamo fare ciò:

  1. Specificare un intervallo di dimensioni per l'iride (possiamo calcolare un intervallo plausibile dalla dimensione della pupilla).
  2. Aumentando la distanza minima tra i centri cerchio (sappiamo due iridi possono mai sovrapporsi, in modo che possiamo tranquillamente impostare questo alla nostra dimensione minima del diaframma)

E poi abbiamo bisogno di fare una ricerca param su param2 di nuovo.Sostituzione della linea di 'HoughCircles' nel codice qui sopra con questo:

cv.HoughCircles(processed, storage, cv.CV_HOUGH_GRADIENT, 2, 100.0, 30, 150,100,140) 

noi ottiene questo:

enter image description here

Il che non è male.

+0

Grazie fraxel. È la stessa procedura per trovare il limite esterno dell'iride? Come puoi vedere il mio problema non è la pupilla, ma l'anello esterno. Ho ottenuto il centroide usando l'isolamento del colore normale come si può vedere qui http://bit.ly/Lqaz4J Darò al codice una prova dopo il ritorno dal lavoro =) Grazie ancora. – pctroll

+0

@pctroll - scusa, mi manca la tua domanda capito! Ho corretto la mia risposta per fare ciò che stai cercando :). Probabilmente puoi usare le informazioni del tuo centroide per posizionare meglio i cerchi. – fraxel

+0

@flaxel - grazie !. E sì, posso lavorare meglio nel centro. Tuttavia, è molto interessante il modo in cui la funzione trova il cerchio nonostante il rumore (ho letto su Hough Transform, ma sono molto visivo e ho avuto Canny e Smooth in ordine inverso). – pctroll

1

Il mio suggerimento alternativo è di usare l'analisi Soglia e Blob. È più semplice rilevare l'iride piuttosto che utilizzare la trasformazione canny edge e hough.

La mia strada è ... Prima la soglia. Prelevare qualsiasi valore di soglia fino a quando l'immagine in bianco e nero produce solo iride e ciglia (colore nero).

Quindi separare l'iride e le ciglia inserendo il valore di analisi della blob min lunghezza a XX e larghezza minima a YY. I valori XX e YY sono il valore della lunghezza e della larghezza dell'iride.

+0

+1 per l'utilizzo dell'analisi Blob invece del rilevamento cerchio Hough. Tendo ad ottenere risultati molto imprecisi con l'implementazione di OpenCV di Circle Hough Transform, come se la dimensione del passo della ricerca dello spazio dei parametri fosse troppo grande. Avrei potuto definire chiaramente cerchi completi, in cui basta adattare il punto centrale di uno o due pixel a un lato per rendere il cerchio rilevato più preciso rispetto ai cambiamenti di contrasto dell'immagine (come visibile anche nelle immagini della risposta accettata). I blob tendono a darmi un punto centrale e un raggio molto più precisi. –

Problemi correlati