OpenCV中用于虹膜检测的HoughCircles的正确用法/参数值是多少?
computer-vision
image-recognition
opencv
python
6
0

我一直在阅读有关该主题的内容,但无法用“普通英语”来了解HoughCircles的用法和参数(特别是CV_HOUGH_GRADIENT之后的用法和参数)。

什么是累加器阈值? 100个“票”是正确的值吗?

我可以找到并“遮盖”学生,并通过Canny函数进行工作,但是我HoughCirclesHoughCircles努力,而我的问题是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)
参考资料:
Stack Overflow
收藏
评论
共 1 个回答
高赞 时间 活跃

HoughCircles可能会HoughCircles棘手,我建议您HoughCircles阅读此主题 。一堆人,包括我在内;),讨论如何使用它。关键参数是param2 ,即所谓的accumulator threshold 。基本上,越高,您获得的圈子越少。并且这些圈子有较高的正确率。每个图像的最佳值都不同。我认为最好的方法是在param2上使用参数搜索。就是继续尝试值直到满足您的条件(例如:有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)

更新资料

我意识到我有点想念您的问题!您实际上想找到虹膜边缘。他们没有像学生那样明确定义。因此,我们需要尽可能多地帮助HoughCircles 。我们可以这样做:

  1. 指定虹膜的大小范围(我们可以根据瞳孔大小得出合理的范围)。
  2. 增加圆心之间的最小距离(我们知道两个光圈永远不会重叠,因此我们可以安全地将其设置为最小光圈大小)

然后,我们需要再次对param2进行参数搜索。以此替换上面代码中的“ HoughCircles”行:

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

得到我们这个:

在此处输入图片说明

这还不错。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号