使用网络摄像头、OpenCV 和 Python 追踪眼睛瞳孔位置。

10
我正在尝试构建一个机器人,可以通过基本的眼部运动来控制。我将网络摄像头对准自己的脸,根据瞳孔的位置,机器人会以一定的方式移动。如果瞳孔在眼睛的上方、下方、左上角、右上角,机器人分别会向前、向后、向左、向右移动。
我的原始计划是使用眼睛haar级联来找到我的左眼。然后我会在眼睛区域上使用houghcircle来找到瞳孔的中心。我会通过找到houghcircle中心到一般眼睛区域边界的距离来确定瞳孔在眼睛中的位置。
因此,在我的代码的第一部分中,我希望能够跟踪眼瞳的中心,就像这个视频中看到的那样。https://youtu.be/aGmGyFLQAFM?t=38 但是当我运行我的代码时,它无法始终找到瞳孔的中心。houghcircle经常画在错误的区域。如何使我的程序始终找到瞳孔的中心,即使眼睛移动了?
告诉我的程序瞳孔最初的位置可能更好/更容易吗?我已经看过一些其他的眼睛跟踪方法,但我无法形成一个通用的算法。如果有人能帮忙形成一个,那将不胜感激!https://arxiv.org/ftp/arxiv/papers/1202/1202.6517.pdf
import numpy as np
import cv2

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('haarcascade_righteye_2splits.xml')

#number signifies camera
cap = cv2.VideoCapture(0)

while 1:
    ret, img = cap.read()
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    #faces = face_cascade.detectMultiScale(gray, 1.3, 5)
    eyes = eye_cascade.detectMultiScale(gray)
    for (ex,ey,ew,eh) in eyes:
        cv2.rectangle(img,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)
        roi_gray2 = gray[ey:ey+eh, ex:ex+ew]
        roi_color2 = img[ey:ey+eh, ex:ex+ew]
        circles = cv2.HoughCircles(roi_gray2,cv2.HOUGH_GRADIENT,1,20,param1=50,param2=30,minRadius=0,maxRadius=0)
        try:
            for i in circles[0,:]:
                # draw the outer circle
                cv2.circle(roi_color2,(i[0],i[1]),i[2],(255,255,255),2)
                print("drawing circle")
                # draw the center of the circle
                cv2.circle(roi_color2,(i[0],i[1]),2,(255,255,255),3)
        except Exception as e:
            print e
    cv2.imshow('img',img)
    k = cv2.waitKey(30) & 0xff
    if k == 27:
        break

cap.release()
cv2.destroyAllWindows()
2个回答

12

我之前做过一些相关工作,发现有两种选择:

  1. 训练一个 Haar 目标检测器,用于检测眼球。使用的训练图像需要以瞳孔中心为中心,以眼球宽度为宽度。我发现这比使用 Hough 圆或 OpenCV 原始眼部检测器(你代码中使用的那个)要好。

  2. 使用 Dlib 的面部标记点来估计眼部区域。然后利用眼球白色和黑色区域之间的对比度以及轮廓来估计瞳孔中心。这产生了更好的结果。


2

只需将创建HoughCircles的那一行替换为以下内容:

circles = cv2.HoughCircles(roi_gray2,cv2.HOUGH_GRADIENT,1,200,param1=200,param2=1,minRadius=0,maxRadius=0)

我刚刚改变了一些参数,这让我的结果更加准确。

关于这些参数的详细信息可以在这里找到。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接