2017-08-21 6 views
5

J'essaie de construire un robot que je peux contrôler avec les mouvements oculaires de base. Je pointe une webcam sur mon visage, et en fonction de la position de ma pupille, le robot bougerait d'une certaine façon. Si la pupille se trouve dans le coin supérieur, inférieur, gauche, droit du robot, le robot se déplace respectivement vers l'avant, l'arrière, la gauche et la droite.Position de la pupille de suivi des yeux avec Webcam, OpenCV et Python

Mon plan initial était d'utiliser une cascade de sourcils pour trouver mon œil gauche. J'utiliserais alors le cercle de croissance sur la région de l'oeil pour trouver le centre de la pupille. Je déterminerais où la pupille était dans l'œil en trouvant la distance entre le centre du cercle et les limites de la région générale des yeux.

Donc pour la première partie de mon code, j'espère être capable de suivre le centre de la pupille de l'œil, comme on le voit dans cette vidéo. Mais quand je cours mon code, il ne peut pas toujours trouver le centre de la pupille. Le cercle est souvent dessiné dans la mauvaise zone. Comment puis-je faire en sorte que mon programme trouve toujours le centre de la pupille, même lorsque l'œil bouge?

Est-il possible/meilleur/plus facile pour moi de dire à mon programme où se trouve l'élève au début? J'ai examiné d'autres méthodes de suivi des yeux, mais je ne peux pas former un algorithme général. Si quelqu'un pouvait aider à en former un, ce serait très apprécié! 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() 

Répondre

5

Je vois deux alternatives, de certains travaux que je faisais avant:

  1. train un détecteur Haar pour détecter le globe oculaire, en utilisant des images de formation avec le centre de la pupille à la centre et la largeur du globe oculaire comme largeur. J'ai trouvé cela mieux que d'utiliser des cercles Hough ou juste le détecteur d'oeil original d'OpenCV (celui utilisé dans votre code).

  2. Utilisez les points de repère de la face de Dlib pour estimer la région de l'œil. Ensuite, utilisez le contraste provoqué par les régions blanches et sombres du globe oculaire, ainsi que les contours, pour estimer le centre de la pupille. Cela a produit de bien meilleurs résultats.