雑な感想
OpenCVのSolvePnPを使って顔の2次元座標を入れれば角度は簡単に取れるが、そもそもMediapipeは3次元座標で推論するからベクトルで計算するので十分じゃね?という話
(OpenCVのライブラリ自体が結構ヘビー級なのでMediapipeと組み合わせるにしても自前で軽量なCoreビルドを作る必要があったり、そもそもMatクラスに変換するオーバーヘッドが無視できない)
どうアプローチしてゆくか
まずMediapipeのリポジトリの画像から468点の頂点Indexは把握しておく。
特徴点 | Index |
鼻先 | 1 |
鼻先とY軸が近い顔のエッジ(左,右) | 361, 132 |
これで「顔面の左右のポイントの中間から鼻先までのベクトル」を顔の向きの近似値として、SolvePnPに頼らない方向の算出が行える。
まあ大体こんなもんでしょう。
精度が欲しければ比較する頂点の数を増やすとか、前のフレームを加味するなどのアプローチはあると思いますが割愛。
参考
- https://github.com/google-ai-edge/mediapipe/issues/3261
- https://medium.com/@susanne.thierfelder/head-pose-estimation-with-mediapipe-and-opencv-in-javascript-c87980df3acb
エンジニアとして働く90年生まれ。Web系技術を追っかけたり、PCガジェットや自転車いじりが趣味。オーディオオタク。