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