我正在处理一个试图识别眼睛瞳孔中间的问题。
现在我正在开发一个Opencv程序来检测瞳孔,我已经实现了这个目标,但我需要提高准确性。因此,我将展示用于检测瞳孔的代码片段和带有结果的图像。
def get_irises_location(self, frame_gray):
self.eye_cascade = cv2.CascadeClassifier(join('haar', 'haarcascade_eye.xml'))
eyes = self.eye_cascade.detectMultiScale(frame_gray, 1.3, 10) # if not empty - eyes detected
irises = []
for (ex, ey, ew, eh) in eyes:
iris_w = int(ex + float(ew / 2))
iris_h = int(ey + float(eh / 2))
irises.append([numpy.float32(iris_w), numpy.float32(iris_h)])
return numpy.array(irises)
正如你所看到的,我已经检测到了眼睛瞳孔,但是我需要在它的中间点击。
答案 0 :(得分:2)
我可以看到,你正在使用Haar分类器检测眼睛。 哈尔分类器不适合开始,但它不是很准确。 也许你可以添加这样的东西:
for (ex, ey, ew, eh) in eyes:
iris_w = int((ex+epsilon) + float((ew / 2)+epsilon))
iris_h = int((ey+epsilon) + float((eh / 2)+epsilon))
irises.append([numpy.float32(iris_w), numpy.float32(iris_h)])
此处, epsilon 是将绿点移动到中间的调整因子。但是,这将无效。
更好的方法是训练模型来检测面部标志,即使瞳孔移开也可以检测到瞳孔的中心。
答案 1 :(得分:2)
好吧,几年前我意识到了一个非常相似的项目。
我们使用了一个小技巧。我们使用红外线(红外线)代替可见光。 在IR中,不依赖于虹膜的真实颜色,虹膜将是浅灰色的,并且瞳孔将是绝对黑色的。这将大大简化您的任务。
我也可以为您提供Open eyes project paper
的链接“睁眼” - 是eyetracker的开源项目,其中软件和硬件文档绝对开放且免费。
我希望它会有所帮助
答案 2 :(得分:0)
如果您打算使用NIR图像,我建议您查看下文中提供的用于检测虹膜的积分微分算子;
https://www.cl.cam.ac.uk/~jgd1000/csvt.pdf
我认为这种方法的实现可以在彩色图像中进行很少的调整。