2D 画像に基づいて、人の顔の 3 つの角度を見つけようとしています。
顔、目、鼻、口を見つけるために、HaarCascade で OpenCV を使用しています。しかし、角度 X、Y、Z (ロール、ピッチ、ヨー) を見つけるのに役立つ幾何学的方法は見つかりませんでした。
誰かがc ++またはjavaで機能するメソッドを示すのを手伝ってくれませんか?
2D 画像に基づいて、人の顔の 3 つの角度を見つけようとしています。
顔、目、鼻、口を見つけるために、HaarCascade で OpenCV を使用しています。しかし、角度 X、Y、Z (ロール、ピッチ、ヨー) を見つけるのに役立つ幾何学的方法は見つかりませんでした。
誰かがc ++またはjavaで機能するメソッドを示すのを手伝ってくれませんか?
画像が 1 つだけで他に情報がない場合、角度の解は 1 つではありません。ヨーだけの場合を考えてみましょう。2D 平面に投影すると、これは、目と鼻/口に対する目の配置の間の投影距離の小さな変化として表示されます。ただし、この距離は個人間で一定ではありません。
これを回避する典型的な方法の 1 つは、ユーザーが顔を「調整」して、公称「0」角度のカメラを直接見ることを要求することです。この時点で、後続の画像を比較できる参照長が得られました。
ただし、見かけの投影距離の変化量は光学系とカメラから顔までの距離に依存するため、長さはまだ十分な情報ではありません。通常は手動で構成する光学系。「平均的な」顔の寸法を仮定し、「公称」画像がそれらの寸法に完全に一致すると仮定することで推定できる距離。特定の面の回転を過大評価または過小評価している場合は、これを調整可能にすることができます。
これらすべての仮定が整ったら、それはかなり単純なジオメトリです。目から鼻、口までのラインからロールを推定できます。目の間隔を測定してヨーを推定できます。最後に、目/口または目/鼻の間の間隔を使用してピッチを推定できます。これらの仮定は、顔がまだ公称値にかなり近い場合に最もうまく機能することに注意してください。
カスケード分類子を使用して右目、左目、鼻を検出する場合、各特徴 (特徴 x/2、特徴 y/2) の重心を計算すると、画像上に 3 つの xy ポイントが得られます。
それぞれの目の Y 値を見てロールを検出できます。一方が他方よりも高い場合は、Y 値が最も低い方向に頭が傾いていることを意味します (片方の目が上に移動すると、もう一方が下に移動します)。
鼻の X 値を見ることでヨーを検出できます。ユーザーが左を向いている場合、鼻の X 値は左目の X 値に近くなり、右目を右に向けた場合も同様です X価値。
鼻の Y 値を見るとピッチを検出できます。ユーザーが上を向いている場合、Y 値は両目の Y 値に近くなり、下を向いている場合、Y 値は目の値から遠ざかります。
もちろん、これは非常に正確ではなく、正確な角度はわかりませんが、この情報を使用して、特定のグループ内の各値を分類してみることができます。
1 つの画像で 3 つすべてを計算することに影響を与えると私が見ることができる唯一のことは、ロールがかなり劇的な場合、X 軸がもはやフラットではないため、ヨーの計算が面倒になる可能性があることです。
これは、2D 回転によって画像を修正することで解決できます。画像をどれだけ回転させる必要があるかを見つける必要があります
Value = (right eye Y / 2) - (left eye Y / 2)
この情報を使用して、画像を修正し、処理を続行できます (画像を回転させて、2D 回転行列を作成し、ワープ アフィンを使用してルックアップします)。
これが少しネクロである場合は申し訳ありませんが、上記の方法がかなり成功していることがわかりました。誰かの助けになることを願っています
したがって、鼻、目、口の位置に基づいて顔の向き (RPY 角度) を見つけたいとします。3 つすべて (4 つ - 2 つの目) が見えると仮定すると、次のように、顔の対称的な特徴を使用して頭の向きを決定します。
目の間の線は、軸の 1 つ (たとえば、ピッチ) の参照として使用できます。次に、Roll 軸が鼻の方向を指していると仮定することができます。これは、目と目の中間点までの鼻の位置の変位によって測定できます。そして最後に、両目の中間点、鼻の位置、口の位置の距離関係からヨーを測定することができます。
4 つの関心点の距離関係はわかりませんが、性別、年齢、出身地によって異なる可能性があります。ただし、そのような関係を見つけることができれば、角度の導出は数学的にかなり簡単になるはずです。
ところで面白いアプリケーション!