我一直在阅读有关该主题的内容,但无法用“简明英语”了解HoughCircles
的用法和参数(特别是CV_HOUGH_GRADIENT
之后的用法和参数)。
什么是累加器阈值? 100“投票”是正确的价值吗?
我可以找到并“掩盖”瞳孔,并通过Canny
函数工作,但我正在努力超越它,我的问题是HoughCircles
函数。似乎没有找到Iris的圈子,我不知道为什么。
这就是我正在努力的功能:
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)
答案 0 :(得分:19)
HoughCircles
可能有点棘手,我建议查看this thread。包括我在内的一群人讨论如何使用它。关键参数是param2
,即所谓的accumulator threshold
。基本上,你获得的圆圈越少越好。并且这些圈子具有更高的正确概率。每张图片的最佳值都不同。我认为最好的方法是在param2
上使用参数搜索。 IE浏览器。继续尝试值,直到满足您的条件(例如:有2个圆圈,或最多不重叠的圆圈等)。我有一些代码在'param2'上进行二进制搜索,因此它很快就符合标准。
另一个关键因素是预处理,尝试降低噪音并简化图像。模糊/阈值/ canny的某些组合对此有好处。
无论如何,我明白了:
从您的上传图片中,使用以下代码:
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)
<强>更新强>
我意识到我有点想念你的问题!您实际上想要找到 iris 边缘。他们没有像学生那样明确定义。所以我们需要尽可能地帮助HoughCircles
。我们可以通过以下方式做到这一点:
然后我们需要再次对param2
进行参数搜索。用以下代码替换上面代码中的“HoughCircles”行:
cv.HoughCircles(processed, storage, cv.CV_HOUGH_GRADIENT, 2, 100.0, 30, 150,100,140)
获取我们:
哪个也不错。
答案 1 :(得分:1)
我的另一个建议是使用阈值和Blob分析。检测虹膜比使用canny edge和hough变换更简单。
我的方式是......首先你要达到它的门槛。拾取任何阈值,直到黑白图像仅产生(黑色)虹膜和睫毛。
然后通过将blob分析值最小长度设置为XX并将最小宽度设置为YY来分离虹膜和睫毛。 XX和YY值是虹膜长度和宽度的值。