2017-08-21 726 views
5

我想構建一個機器人,我可以控制基本的眼球運動。我在我的臉上指着一個攝像頭,根據我瞳孔的位置,機器人會以某種方式移動。如果瞳孔位於眼睛的頂部,底部,左角和右角,則機器人會分別向前,向後,向左,向右移動。跟蹤攝像頭,OpenCV和Python的眼睛瞳孔位置

我最初的計劃是使用眼睛哈爾級聯找到我的左眼。然後,我會在眼睛區域使用圓圈來找到瞳孔的中心。我會通過找到從圓圈中心到整個眼睛區域邊界的距離來確定瞳孔在眼睛裏的位置。

因此,對於我的代碼的第一部分,我希望能夠跟蹤這個視頻中看到的眼睛瞳孔的中心。 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() 

回答

5

我可以看到兩個選擇,從一些工作,我沒有之前:

  1. 火車哈爾檢測器來檢測眼球,使用與瞳孔的中心訓練圖像中心和眼球的寬度作爲寬度。我發現這比使用Hough圓或OpenCV的原始眼睛檢測器(您的代碼中使用的那個)要好。

  2. 使用Dlib的臉部界標點來估計眼部區域。然後使用由眼球的白色和黑色區域以及輪廓引起的對比來估計瞳孔的中心。這產生了更好的結果。