17

長すぎると思う人は、太字の行だけ読んでください。

視線推定ベースの画面カーソル移動 HCI の私のプロジェクトは、最後の 1 つに依存するようになりました。視線推定では、瞳孔の動きを検出して視線を計算するための参照安定点として目の角を使用しています。

しかし、ライブ Web カメラ フィードから目尻を安定して検出することはできませんでした。私は cv.CornerHarris() と GFTT - cv.GoodFeaturesToTrack() 関数をコーナー検出に使用しています。FAST デモ (彼らの Web サイトからの実行可能ファイル) を目の画像で直接試しましたが、うまくいきませんでした。

これらは、これまでの画像のコーナー検出の結果です。

GFTT の使用:

良い照明、GFTT を使用

ハリスの使用:

cv.CornerHarris の使用

ビデオで何が起こるか:

GFTT を使用したビデオのコーナー 緑色の円は角で、その他 (ピンク色の小さい円) はその他の角です。

私は特定のヒューリスティックを使用しました - 垂直に考えた場合、コーナーは左端または右端にあり、真ん中あたりになるということです。画像の 5% 未満を除いて、多くの条件で多くのスナップショットを撮った後、残りはこのようなものであり、それらについては上記のヒューリスティックが保持されるため、私はこれを行いました。

ただし、これらの目の角の検出はスナップショット用であり、Web カメラ フィードからのものではありません。

ウェブカメラ フィードに手法 (ハリスと GFTT) を使用すると、それらが得られません。

cv.CornerHarris を使用した目尻検出のコード

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 の間にあることがわかったので、それを使用して候補プールを最小化しました

4

3 に答える 3

6

簡単にできる方法があると思います!

それぞれの目を切り離して考えているように見えます。私がお勧めするのは、両目のデータを組み合わせ、顔のジオメトリも使用することです。私の提案を、一部の人が認識できる写真で説明します (これは絵であり、彼女の顔は少し中心からずれているため、実際には最良の例ではありませんが、確かに最も面白いです..)

ここに画像の説明を入力

両目の瞳孔位置の信頼できる推定値があるようで、顔がカメラをかなりまっすぐに見ている場合 (この方法を使用すると、画面に垂直な顔の回転は問題ありません)、目の角 (これからは、両目の瞳孔を通る線 (赤い点線) 上 (またはその近く) にあるだけです。

私たちは、瞳孔間の距離aを知っており、この距離と片目の距離 (隅から隅まで) との比率 はb、個人ごとに固定されており、成人集団全体であまり変化しないことがわかっています (異なる場合があります)。性別間)。

ie. a / b = constant.

したがって、カメラからの被写体の距離に関係なく、 だけがわかれば、b を推定できaます。

この情報を使用して、各目の角のしきい値ボックスを作成できます (点線のボックス、詳細は とラベル付けされています1, 2, 3, 4)。各ボックスはb(c眼の高さ、同じ固定比率の原則によって決定可能) であり、瞳孔軸に平行に配置されています。各ボックスの中心エッジは瞳孔の中心に固定され、瞳孔とともに移動します。各コーナーは常に独自のしきい値ボックスにあることを知っています!

さて、もちろん問題は瞳孔が動き回ることであり、しきい値ボックスも同様です...しかし、すべての推定目の位置を自信を持って破棄できるため、この方法でフィールドを大幅に絞り込みました(HarrisやGFTTなどから)これらのボックスの外に落ちます (瞳孔の検出に自信がある場合)。

  • 角の 1 つの位置だけに高い信頼性がある場合は、ジオメトリだけから他のすべての角の位置を外挿して推定することができます。(両目用!)。

  • 複数の角の位置に疑問がある場合は、(どちらかの目からの) 他の角の知識を使用して、それらの位置を確率的に関連付けて解決し、最良の推測を行うことができます。すなわち。任意のペアの推定値 (もちろんボックス内) はb離れており、瞳孔軸に平行です。

  • 瞳孔が動き回っても動かない一般的な「目」の位置 (または実際には同じ平面上の顔の特徴) を取得できる場合、これは非常に便利で、角の位置を幾何学的に決定できます。

dこれがとらえどころのないもの (目の中心からの瞳孔のずれ)を見つけるのに役立つことを願っています。

于 2012-03-15T16:35:06.860 に答える
5

私はこれを変更しました

if ( x<colorImage.width/5 or x>((colorImage.width/4)*3) ) and (y>40 and y<70):

これに:

if ( x<(w/5) or x>((w/4)*3) ) and (y>int(h*0.45) and y<int(h*0.65)):

以前は、ピクセル値を手動で見ていただけだったので、それを超えるとウィンドウが最も高い確率でコーナーを見つけることができました。しかし、後で気づいたので、一般的にしましょう。そこで、Y 範囲の 45 から 65 pc、X 範囲の 1/5 から 3/4 の水平ウィンドウを作成しました。

プロジェクトの後半部分である視線推定で忙しかったので、返信が遅くなり申し訳ありません。そして、私はそれについて質問を投稿するつもりです、私はそれに行き詰まっています。

ところで、ここに私の目で検出された目尻と瞳孔の写真がいくつかあります: (100x100 に拡大)

ここに画像の説明を入力

ここに画像の説明を入力

ここに画像の説明を入力 これが、この分野を始める他の人にとって役立つことを願っています。

于 2012-04-08T10:34:32.150 に答える