我正在尝试构建一个可以通过基本的眼球运动来控制的机器人。我将网络摄像头对准我的脸,根据学生的位置,机器人会以某种方式移动。如果瞳孔在眼睛的上,下,左,右角,则机器人将分别向前,向后,向左,向右移动。

我最初的计划是使用眼神级联来找到我的左眼。然后,我将在眼睛区域使用霍夫圆来找到瞳孔的中心。通过确定从霍夫圆环的中心到普通眼睛区域边界的距离,我可以确定瞳孔在眼睛中的位置。

因此,对于我的代码的第一部分,我希望能够跟踪眼瞳孔的中心,如该视频所示。 https://youtu.be/aGmGyFLQAFM?t=38

但是,当我运行我的代码时,它不能始终如一地找到瞳孔的中心。霍夫环经常绘制在错误的区域。即使眼睛移动,如何使我的程序始终能找到瞳孔的中心?

我可以/更好/更容易地告诉我的程序学生在哪里开始吗?
我看过其他一些眼动追踪方法,但无法形成通用算法。如果有人可以帮助组建一个,将不胜感激!
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()

最佳答案

从我之前所做的一些工作中,我可以看到两种选择:

  • 使用训练图像(以瞳孔中心为中心,眼球宽度为宽度)训练Haar检测器以检测眼球。我发现这比使用霍夫圆或仅使用OpenCV的原始眼图检测器(您的代码中使用的那个)更好。
  • 使用Dlib的脸部界标点估计眼睛区域。然后使用由眼球的白色和深色区域以及轮廓所引起的对比度来估计瞳孔的中心。这产生了更好的结果。
  • 10-06 05:20