2017-08-21 78 views
5

Próbuję zbudować robota, który będę mógł kontrolować za pomocą podstawowych ruchów oczu. Wskazuję kamerę na moją twarz iw zależności od pozycji mojego ucznia, robot porusza się w określony sposób. Jeśli źrenica znajduje się w górnym, dolnym, lewym rogu, prawym kąciku oka, robot porusza się odpowiednio w przód, w tył, w lewo iw prawo.Uczeń śledzący pozycję z kamerą internetową, OpenCV i pytonem

Mój pierwotny plan polegał na wykorzystaniu kaskady oka, aby znaleźć lewe oko. Wówczas użyłbym houghcircle na obszarze oczu, by znaleźć środek źrenicy. Ustaliłbym, gdzie uczeń był w oku, znajdując odległość od środka houghcircle do granic ogólnego obszaru oczu.

Tak więc w pierwszej części mojego kodu, mam nadzieję, że będę w stanie śledzić centrum źrenicy oka, jak widać w tym filmie. https://youtu.be/aGmGyFLQAFM?t=38

Ale kiedy uruchomię mój kod, nie może on konsekwentnie znaleźć centrum źrenicy. Houghcircle często jest rysowany w niewłaściwym miejscu. W jaki sposób mogę sprawić, by mój program konsekwentnie znajdował środek źrenicy, nawet gdy oko porusza się?

Czy mogę/lepiej/łatwiej powiedzieć programowi, w którym uczeń jest na początku? Przyjrzałem się innym metodom śledzenia oka, ale nie mogę utworzyć ogólnego algorytmu. Jeśli ktokolwiek mógłby pomóc w stworzeniu takiego, byłoby to bardzo cenne! 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() 

Odpowiedz

5

widzę dwie możliwości, z niektórych prac, które robiłem wcześniej:

  1. Pociąg detektor Haar wykryć gałki ocznej za pomocą obrazów treningowych ze środkiem źrenicy Pod środek i szerokość gałki ocznej jako szerokość. Znalazłem to lepiej niż przy użyciu kółek Hougha lub tylko oryginalnego detektora oczu OpenCV (tego używanego w twoim kodzie).

  2. Użyj punktów orientacyjnych twarzy Dlib, aby oszacować okolice oczu. Następnie użyj kontrastu spowodowanego przez białe i ciemne obszary gałki ocznej, wraz z konturami, aby oszacować środek źrenicy. To przyniosło znacznie lepsze wyniki.