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()