長すぎると思う人は、太字の行だけ読んでください。
視線推定ベースの画面カーソル移動 HCI の私のプロジェクトは、最後の 1 つに依存するようになりました。視線推定では、瞳孔の動きを検出して視線を計算するための参照安定点として目の角を使用しています。
しかし、ライブ Web カメラ フィードから目尻を安定して検出することはできませんでした。私は cv.CornerHarris() と GFTT - cv.GoodFeaturesToTrack() 関数をコーナー検出に使用しています。FAST デモ (彼らの Web サイトからの実行可能ファイル) を目の画像で直接試しましたが、うまくいきませんでした。
これらは、これまでの画像のコーナー検出の結果です。
GFTT の使用:
ハリスの使用:
ビデオで何が起こるか:
緑色の円は角で、その他 (ピンク色の小さい円) はその他の角です。
私は特定のヒューリスティックを使用しました - 垂直に考えた場合、コーナーは左端または右端にあり、真ん中あたりになるということです。画像の 5% 未満を除いて、多くの条件で多くのスナップショットを撮った後、残りはこのようなものであり、それらについては上記のヒューリスティックが保持されるため、私はこれを行いました。
ただし、これらの目の角の検出はスナップショット用であり、Web カメラ フィードからのものではありません。
ウェブカメラ フィードに手法 (ハリスと GFTT) を使用すると、それらが得られません。
現在、両方の方法で使用するパラメーター-異なる照明条件の結果は表示されず、明らかに. しかし、これらのスナップショットが撮影されたのと同じ照明条件では、ウェブカメラ ビデオからクエリしたフレームの結果がまだ得られていません。
GFTT からのこれらのパラメーターは、平均的な照明条件に適しています
cornerCount = 100
qualityLevel = 0.1
minDistance = 5
これらに対して:
cornerCount = 500
qualityLevel = 0.005
minDistance = 30
上に表示された静止画像ではうまくいきました
minDistance = 30 であることは明らかです。なぜなら、コーナーには少なくともそれだけの距離があるからです。これもまた、スナップから見た傾向のようなものです。しかし、GFTT のウェブカメラ フィード バージョンでは値を下げました。
また、GFTT のライブ フィード バージョンについては、私が対応しなければならなかった小さな変更があります。
cv.CreateImage((colorImage.width, colorImage.height), 8,1)
一方、静止画像バージョン(ペーストビンのコード)では、次を使用しました:
cv.CreateImage(cv.GetSize(grayImage), cv.IPL_DEPTH_32F, 1)
深さに注意。
それは検出の質を変えるでしょうか??
GFTT メソッドに合格していた目の画像は 32F の深さを持っていなかったので、それを変更し、残りの一時的な画像 (eignenimg、tempimg など) に従って変更する必要がありました。
結論: 視線推定を終了する必要がありますが、安定した目尻検出がなければ先に進むことができません..そして、まばたき検出とテンプレート マッチング ベースの瞳孔追跡に取り掛かる必要があります (または、もっとよく知っていますか?)。簡単に言えば、ここに投稿したスナップで取得したウェブカメラ ビデオ ストリームで、初歩的なミスを犯したり、完璧に近い目尻検出を妨げていることをしていないかどうかを知りたいのです。
とにかく、これを見てくれてありがとう。さまざまな照明条件で目の角の検出をどのように実行できるかについてのアイデアは非常に役立ちます
さて、コードで私がやっていること (左右のコーナーを取得する方法) が理解できなかった場合は、次のように説明します。
max_dist = 0
maxL = 20
maxR = 0
lc =0
rc =0
maxLP =(0,0)
maxRP =(0,0)
for point in cornerMem:
center = int(point[0]), int(point[1])
x = point[0]
y = point[1]
if ( x<colorImage.width/5 or x>((colorImage.width/4)*3) ) and (y>40 and y<70):
#cv.Circle(image,(x,y),2,cv.RGB(155, 0, 25))
if maxL > x:
maxL = x
maxLP = center
if maxR < x:
maxR = x
maxRP = center
dist = maxR-maxL
if max_dist<dist:
max_dist = maxR-maxL
lc = maxLP
rc = maxRP
cv.Circle(colorImage, (center), 1, (200,100,255)) #for every corner
cv.Circle(colorImage,maxLP,3,cv.RGB(0, 255, 0)) # for left eye corner
cv.Circle(colorImage,maxRP,3,cv.RGB(0,255,0)) # for right eye corner
maxLP と maxRP は、それぞれ目の左隅と右隅の (x,y) を格納します。私がここでやっていることは、検出されたコーナーの x 値と比較される左右のコーナー検出、それぞれ maxL と maxR の変数を取得することです。簡単に言うと、maxL の場合は 0 より大きい必要があります。左隅が x<20 の (x,y) にある場合、maxL は = x になるため、20 を割り当てました。右端も同様。
私も maxL = 50 を試しました (ただし、これは、左隅が目の領域のほぼ中央にあることを意味します)、ウェブカメラ フィードのより多くの候補を取得するためです。コーナーがまったく得られません。
また、max_dist は、これまでに確認された X 座標間の最大距離を格納し、どのコーナーのペアが左右の目のコーナーになるかの尺度を提供します - 最大距離 = max_dist を持つもの
また、スナップショットから、目の角の Y 座標が 40 ~ 70 の間にあることがわかったので、それを使用して候補プールを最小化しました