2012-05-23 4 views
11

Ich habe über das Thema gelesen, aber kann nicht die Idee in "plain English" über die Verwendung und die Parameter für HoughCircles (speziell die nach CV_HOUGH_GRADIENT).Was sind die korrekten Gebrauchs-/Parameterwerte für HoughCircles in OpenCV zur Iriserkennung?

Was ist eine Akkumulatorschwelle? Sind 100 "Stimmen" ein richtiger Wert?

Ich konnte die Pupille finden und "maskieren" und arbeitete mich durch die Canny Funktion, aber ich bin darüber hinaus kämpfen und mein Problem ist die HoughCircles Funktion. Es scheint, dass es nicht gelingt, den Kreis der Iris zu finden, und ich weiß nicht warum.

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

Und dies ist die Funktion arbeite ich an:

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) 

Antwort

15

HoughCircles kann etwas schwierig sein, schlage ich vor der Suche durch this thread. Wo ein paar Leute, mich eingeschlossen;), diskutieren, wie man es benutzt. Der Schlüsselparameter ist param2, der sogenannte accumulator threshold. Grundsätzlich gilt, je höher desto weniger Kreise bekommt man. Und diese Kreise haben eine höhere Wahrscheinlichkeit, richtig zu sein. Der beste Wert ist für jedes Bild unterschiedlich. Ich denke, der beste Ansatz ist die Verwendung einer Parametersuche unter param2. Ie. Versuche solange, bis deine Kriterien erfüllt sind (zB: es gibt 2 Kreise oder max. Anzahl von Kreisen, die sich nicht überschneiden, etc.). Ich habe einen Code, der eine binäre Suche nach 'param2' durchführt, damit er die Kriterien schnell erfüllt.

Der andere entscheidende Faktor ist die Vorverarbeitung, versuchen, Rauschen zu reduzieren und das Bild zu vereinfachen. Eine gewisse Kombination von Unschärfe/Schwellenwertbildung/canny ist dafür gut.

Wie auch immer, ich dies:

enter image description here

Von Ihrem uploded Bild, mit diesem Code:

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) 

aktualisieren

Ich weiß, ich etwas vermissen ablesbare Ihre Frage! Sie möchten tatsächlich die Iris Kanten finden. Sie sind nicht so klar definiert wie die Schüler. Also müssen wir HoughCircles so viel wie möglich helfen. Wir können dies tun, indem wir:

  1. Angeben eines Größenbereichs für die Iris (wir können einen plausiblen Bereich von der Pupillengröße ausarbeiten).
  2. den Mindestabstand zwischen Kreismittel Erhöhung (wir kennen zwei Iris niemals überlappen, so können wir dies auf unsere Mindest Iris Größe sicher eingestellt)

Und dann müssen wir wieder auf param2 eine param Suche tun.Ersetzen Sie die Zeile 'HoughCircles' in den obigen Code mit diesem:

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

Ruft uns diese:

enter image description here

Was nicht so schlimm ist.

+0

Danke fraxel. Ist es das gleiche Verfahren, um die äußere Grenze der Iris zu finden? Wie Sie sehen können, ist mein Problem nicht die Pupille, sondern der äußere Augenring. Ich habe den Schwerpunkt mit der normalen Farbisolierung wie hier zu sehen http://bit.ly/Lqaz4J Ich gebe Ihren Code einen Versuch nach der Rückkehr von der Arbeit =) Danke nochmal. – pctroll

+0

@pctroll - Entschuldigung, ich vermisse deine Frage! Ich habe meine Antwort korrigiert, um das zu tun, wonach Sie suchen :). Sie können wahrscheinlich Ihre Zentroid-Informationen verwenden, um die Kreise besser zu positionieren. – fraxel

+0

@flaxel - danke! Und ja, ich kann das Zentrum besser ausarbeiten. Es ist jedoch sehr interessant, wie die Funktion den Kreis trotz des Rauschens findet (ich habe über Hough Transformation gelesen, aber ich bin sehr visuell und ich hatte Canny und Smooth in umgekehrter Reihenfolge). – pctroll

1

Mein alternativer Vorschlag ist die Schwellwert- und Blobanalyse. Es ist einfacher, eine Iris zu erkennen als eine schlaue Kante und eine Hough-Transformation.

Mein Weg ist ... Zuerst Sie Schwelle es. Nehmen Sie jeden Schwellenwert auf, bis das Schwarzweißbild nur eine (schwarze) Iris und Wimpern erzeugt.

Dann trennen Sie die Iris und Wimpern durch Blob Analyse Wert min Länge bei XX und min Breite bei YY. Der Wert für XX und YY ist der Wert für die Länge und Breite der Blende.

+0

+1 für die Verwendung der Blob-Analyse anstelle der Hough-Kreiserkennung. Ich neige dazu, mit der OpenCV-Implementierung der Circle-Hough-Transformation sehr ungenaue Ergebnisse zu erhalten, als ob die Schrittgröße der Parameterraumsuche zu groß wäre. Ich hätte ganz klare Kreise definieren können, bei denen nur ein oder zwei Pixel an einer Seite den Mittelpunkt anpassen würden, würde der erkannte Kreis viel genauer zu den Kontraständerungen im Bild passen (wie auch in den Bildern der akzeptierten Antwort sichtbar)). Blobs geben mir einen viel präziseren Mittelpunkt und Radius. –