14

私は主題について読んでいますが、HoughCircles(特に の後のものCV_HOUGH_GRADIENT)の使用法とパラメータについて「平易な英語」で考えを得ることができません。

アキュムレータのしきい値とは何ですか? 100「投票」は正しい値ですか?

瞳孔を見つけて「マスク」し、Canny関数を処理しましたが、それ以上に苦労しており、問題はHoughCircles関数です。アイリスのサークルを見つけるのに失敗しているようですが、その理由はわかりません。

これは私がこれまでに持っているものです。 左: マスクされた瞳孔 右: 見事な結果

そして、これは私が取り組んでいる機能です:

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)
4

2 に答える 2

25

HoughCirclesちょっとトリッキーかもしれませんが、このスレッドに目を通しておくことをお勧めします。私を含む多くの人々が ;)、それを使用する方法について議論します。重要なパラメータはparam2、いわゆるaccumulator thresholdです。基本的に、それが高いほど、得られる円は少なくなります。そして、これらの円は正しい可能性が高くなります。最良の値は、画像ごとに異なります。でパラメータ検索を使用するのが最善の方法だと思いますparam2。すなわち。基準が満たされるまで値を試し続けます (例: 2 つの円がある、または重ならない円の最大数など)。「param2」でバイナリ検索を行うコードがいくつかあるので、すぐに基準を満たします。

もう 1 つの重要な要素は、前処理、ノイズの削減、画像の単純化です。これには、ぼかし/しきい値/キャニーの組み合わせが適しています。

とにかく、私はこれを取得します:

ここに画像の説明を入力

アップロードした画像から、次のコードを使用します。

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)

アップデート

私はあなたの質問を少し読み逃したことに気づきました!実際には、虹彩のエッジを見つけたいと考えています。彼らは生徒ほど明確に定義されていません。そのため、私たちはHoughCircles可能な限り支援する必要があります。これを行うには、次の方法があります。

  1. 虹彩のサイズ範囲を指定します (瞳孔サイズから妥当な範囲を割り出すことができます)。
  2. 円の中心間の最小距離を大きくする (2 つの虹彩が重ならないことがわかっているため、これを最小の虹彩サイズに安全に設定できます)

そして、再度パラメータ検索を行う必要がありますparam2。上記のコードの「HoughCircles」行を次のように置き換えます。

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

これを取得します:

ここに画像の説明を入力

これはそれほど悪くありません。

于 2012-05-23T11:27:11.997 に答える