web-dev-qa-db-ja.com

Webカメラ、OpenCV、およびPython

基本的な眼球運動で制御できるロボットを作ろうとしています。私は自分の顔にウェブカメラを向けており、生徒の位置に応じて、ロボットは特定の方向に動きます。瞳孔が目の上、下、左隅、右隅にある場合、ロボットはそれぞれ前方、後方、左、右に動きます。

私の最初の計画は、左目を見つけるためにアイハーカスケードを使用することでした。次に、目の領域にハフサークルを使用して、瞳孔の中心を見つけます。私は、大輪の中心から一般的な目の領域の境界までの距離を見つけることによって、瞳孔が目のどこにあったかを判断します。

コードの最初の部分では、このビデオで見られるように、瞳孔の中心を追跡できることを望んでいます。 https://youtu.be/aGmGyFLQAFM?t=38

しかし、コードを実行すると、一貫して生徒の中心を見つけることができません。囲みは、間違った領域に描かれることがよくあります。目が動いても、プログラムで一貫して瞳孔の中心を見つけるにはどうすればよいですか?

生徒が最初にどこにいるのかをプログラムに伝えることは可能/良い/簡単ですか?他のいくつかのアイトラッキング方法を見てきましたが、一般的なアルゴリズムを作成できません。誰かが1つを形成するのを手伝ってくれるなら、それは大歓迎です! 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()
8
user3502541

以前に行ったいくつかの作業から、2つの代替案を確認できます。

  1. 瞳孔の中心を中心とし、眼球の幅を幅とするトレーニング画像を使用して、Haar検出器をトレーニングして眼球を検出します。これは、ハフ円またはOpenCVのオリジナルの目検出器(コードで使用されているもの)を使用するよりも優れていることがわかりました。

  2. Dlibの顔のランドマークポイントを使用して、目の領域を推定します。次に、瞳孔の中心を推定するために、輪郭とともに、眼球の白と暗い領域によって引き起こされるコントラストを使用します。これにより、はるかに良い結果が得られました。

8
Totoro

HoughCirclesを作成した行を次のように置き換えるだけです。

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

いくつかのパラメーターを変更しただけで、より正確になりました。

パラメータの詳細情報 ここ