2017-08-21 14 views
5

Tôi đang cố gắng xây dựng một rô-bốt mà tôi có thể kiểm soát bằng các chuyển động cơ bản của mắt. Tôi đang chỉ một webcam trên khuôn mặt của tôi, và tùy thuộc vào vị trí của học trò của tôi, robot sẽ di chuyển một cách nhất định. Nếu học sinh ở trên cùng, dưới cùng, góc trái, góc phải của mắt, robot sẽ di chuyển về phía trước, ngược, trái, phải tương ứng.Theo dõi vị trí học sinh của con mắt với Webcam, OpenCV và Python

Kế hoạch ban đầu của tôi là sử dụng thác thác mắt để tìm mắt trái của tôi. Sau đó tôi sẽ sử dụng houghcircle trên vùng mắt để tìm trung tâm của học sinh. Tôi sẽ xác định vị trí của học trò trong mắt bằng cách tìm khoảng cách từ trung tâm của houghcircle đến biên giới của vùng mắt nói chung.

Vì vậy, đối với phần đầu tiên của mã của tôi, tôi hy vọng có thể theo dõi trung tâm của học sinh mắt, như đã thấy trong video này. https://youtu.be/aGmGyFLQAFM?t=38

Nhưng khi tôi chạy mã, nó không thể tìm thấy trung tâm của học sinh. Houghcircle thường được vẽ ở khu vực sai. Làm thế nào tôi có thể làm cho chương trình của tôi nhất quán tìm thấy trung tâm của học trò, ngay cả khi mắt di chuyển?

Có thể/tốt hơn/dễ dàng hơn cho tôi khi nói cho chương trình của tôi biết khi nào học trò bắt đầu? Tôi đã xem xét một số phương pháp theo dõi mắt khác, nhưng tôi không thể tạo thành một thuật toán chung. Nếu bất cứ ai có thể giúp hình thành một, điều đó sẽ được nhiều đánh giá cao! 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() 

Trả lời

5

Tôi có thể thấy hai lựa chọn thay thế, từ một số công việc mà tôi đã làm trước đây:

  1. Train một máy dò Haar để phát hiện nhãn cầu, sử dụng hình ảnh đào tạo với các trung tâm của học sinh tại trung tâm và chiều rộng của nhãn cầu là chiều rộng. Tôi tìm thấy điều này tốt hơn so với sử dụng vòng tròn Hough hoặc chỉ là máy dò mắt ban đầu của OpenCV (cái được sử dụng trong mã của bạn).

  2. Sử dụng các điểm mốc trên khuôn mặt của Dlib để ước tính vùng mắt. Sau đó, sử dụng độ tương phản gây ra bởi các vùng màu trắng và bóng tối của nhãn cầu, cùng với các đường nét, để ước tính trung tâm của học sinh. Điều này tạo ra kết quả tốt hơn nhiều.

Các vấn đề liên quan