2013-05-06 76 views
7

私は人の顔の3つの角度を、2D画像2D imageに基づいて見つけようとしています。OpenCV、C++、画像2Dによる頭部姿勢推定 - 幾何学的方法 - ロール、ヨー、ピッチ

私は顔、目、鼻、口を見つけるためにHaarCascadeでOpenCVを使用しています。 しかし、角度X、Y、Z(ロール、ピッチ、ヨー)を見つけるのに役立つ幾何学的方法は見つかりませんでした。

誰かがC++やjavaで動作するいくつかの方法を教えてくれますか?

+0

場合、これはので、私はそのタグを削除したC++の質問ではありません。 –

答えて

5

画像が1つで、他の情報がない場合、角度には単一の解はありません。ヨーだけの場合を考えてみましょう。 2次元平面に投影すると、目の投影距離と鼻/口に対する目の配置に小さな変化として目に見えます。しかし、この距離は人から人まで一定ではありません。

これを回避する典型的な方法の1つは、公称 '0'の角度でカメラを直接見ることによってユーザーが顔を較正することを要求することです。この時点で、後続の画像を比較できる基準長さになりました。

しかし、見掛けの投影距離が変化する量は、光学系およびカメラからの顔の距離によって決まります。あなたは通常手動で設定する光学系です。 「平均」顔寸法を仮定し、「名目」画像がそれらの寸法と完全に一致すると仮定することによって推定できる距離。特定の顔の回転を過大または過小評価している場合は、調整可能にすることができます。

これらの前提条件がすべて満たされれば、それはかなり単純なジオメトリです。目から鼻、口までのラインからのロールを見積もることができます。あなたはヨーを推定するために目の間隔を測定することができます。最後に、目/口または目/鼻の間隔を使ってピッチを推定することができます。これらの仮定は、顔が依然として名目上かなり近いときに最も効果的です。

+0

しかし、これを行うにはC++でいくつかの方法を知りたいと思います。 –

0

したがって、鼻、目、口の位置に基づいて、顔の向き(RPY角度)を探したいとします。 3つすべて(4 - 2つの目)が見えていると仮定すると、私は頭の向きを決定するために顔の対称的な特徴を使用するでしょう:

目の間の線は、軸(例えば、ピッチ)である。次に、ロール軸が鼻の方向を指していると仮定することができます。鼻の方向は、鼻の目の中間点までの位置ずれによって測定できます。最後に、目の中間点、鼻の位置、および口の位置の間の距離の関係によってヨーを測定することができました。

私は4つの興味のポイント間の距離の関係を知らないし、おそらくジェンダー、年齢、および起源に関して異なっている。しかし、このような関係を見つけることができれば、角度の導出は数学的にはむしろまっすぐ進むはずです。

ところで面白いアプリケーション!

0

カスケード分類器を使用して右目、左目、鼻を検出する場合は、各特徴(フィーチャx/2、フィーチャy/2)の重心を計算すると、イメージに3つのx-y点が与えられます。

各目のY値を見ることでロールを検出できます。一方の目が高い場合は、ヘッドが最も低いY値の方向に傾いていることを意味します)

鼻のX値を見ることで、鼻のX値を調べることができます。ユーザーが左を見ると、鼻のX値は左目のX値に近くなり、右も同じです右目X値で。

鼻のY値を調べることでピッチを検出することができます。ユーザーがルックアップしている場合、Y値は両目のY値に近くなり、見下ろすとY値はさらに離れます目の値

これは当然のことながら、正確な角度ではありませんが、この情報を使用して特定のグループ内の各値を試して分類することができます(前向き、左向き、本当に

1つの画像で3つすべてを計算することがわかる唯一のことは、ロールがかなり劇的で、X軸がもはやフラットではないので、ヨーが厄介かもしれないと計算した場合かもしれません。

これを解決するには、2D回転で画像を補正します。あなたは、画像が2D回転行列を作成し、ワープアフィンを使用して、ルックアップに回転する(画像はこの情報を使用して

Value = (right eye Y/2) - (left eye Y/2) 

で回転する必要がどのくらいあなたが画像を補正し、処理を続行することができます見つける必要があります )

申し訳ありませんが、これはネクロのビットですが、私はかなり成功するために上記の方法を発見し、私はそれが助けを願っ誰か

関連する問題