web-dev-qa-db-de.com

Verfolgen Sie die Position des Augenschülers mit Webcam, OpenCV und Python

Ich versuche einen Roboter zu bauen, den ich mit einfachen Augenbewegungen steuern kann. Ich zeige eine Webcam auf mein Gesicht und abhängig von der Position meiner Pupille würde sich der Roboter in eine bestimmte Richtung bewegen. Wenn sich die Pupille in der oberen, unteren, linken und rechten Ecke des Auges befindet, bewegt sich der Roboter vorwärts, rückwärts, links bzw. rechts.

Mein ursprünglicher Plan war, eine Augenhaarkaskade zu verwenden, um mein linkes Auge zu finden. Ich würde dann houghcircle auf der Augenregion verwenden, um das Zentrum der Pupille zu finden. Ich würde feststellen, wo sich die Pupille im Auge befand, indem ich den Abstand vom Zentrum des Kreises zu den Rändern der allgemeinen Augenregion herausfinde.

Für den ersten Teil meines Codes hoffe ich, in der Lage zu sein, die Mitte der Augenpupille zu verfolgen, wie in diesem Video zu sehen ist. https://youtu.be/aGmGyFLQAFM?t=38

Wenn ich meinen Code ausführte, kann er jedoch nicht ständig das Zentrum des Schülers finden. Der Kreisel ist oft im falschen Bereich gezeichnet. Wie kann ich erreichen, dass mein Programm den Mittelpunkt der Pupille konstant findet, auch wenn sich das Auge bewegt?

Ist es möglich/besser/einfacher für mich, meinem Programm mitzuteilen, wo sich der Schüler am Anfang befindet? Ich habe mir andere Eye-Tracking-Methoden angesehen, kann aber keinen allgemeinen Algorithmus erstellen. Wenn jemand helfen könnte, wäre das sehr dankbar! 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()
6
user3502541

Ich sehe zwei Alternativen aus einigen Arbeiten, die ich zuvor gemacht habe:

  1. Trainieren Sie einen Haar-Detektor, um den Augapfel zu erkennen. Verwenden Sie dazu Trainingsbilder, wobei die Mitte der Pupille in der Mitte und die Breite des Augapfels als Breite dienen. Ich fand das besser als Hough-Kreise oder nur den ursprünglichen Augendetektor von OpenCV (den in Ihrem Code verwendeten).

  2. Verwenden Sie die Gesichtsmarkierungspunkte von Dlib, um die Augenregion abzuschätzen. Verwenden Sie dann den durch die weißen und dunklen Bereiche des Augapfels verursachten Kontrast zusammen mit den Konturen, um den Mittelpunkt der Pupille zu bestimmen. Dies führte zu viel besseren Ergebnissen.

7
Totoro

Ersetzen Sie einfach die Zeile, in der Sie HoughCircles erstellt haben, durch Folgendes:

circles = cv2.HoughCircles(roi_gray2,cv2.HOUGH_GRADIENT,1,200,param1=200,param2=1,minRadius=0,maxRadius=0)

Ich habe gerade ein paar Parameter geändert und es gibt mir mehr Genauigkeit.

Detaillierte Informationen zu den Parametern hier .