1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

MediaPipeのフェイストラッキングを使ってUnity上のキャラクターを動かす

Last updated at Posted at 2025-06-23

(2025/06時点の記事です)

経緯

・OpenCV+Dlibでフェイストラッキングを行っていたら、キャラクターを動かしたくなった
・でもDlibの顔検出って片目隠れるくらい横向くと外れるよね…じゃあ他のヤツ使おうか!
・MediaPipeいいじゃん!でもC#でラッパー?一応あるけどこれいつの???
・MediaPipeが正式にサポートしてるのはPythonか…

開発環境

・Python 3.12.10
・Unity 6.1

大まかな設計

 とりあえず、カメラ処理をPythonで、Unity処理をC#で行うことだけは決まった。
 問題はどうやってやりとりするかだが…

正直Pythonは詳しくない

 正直Pythonは詳しくない。トラッキングはリアルタイム処理だ。それなりの速度が求められる。
 そんな中、パフォーマンスの悪い書き方も最適化の手段もわからん。そんな手探り状態で長々と処理を書くやる気は私にはない…
 つまり、Python部分は出来る限り少なく書きたい。
 というわけで、Python部分をどうするか、いくつか挙げてみる
 ・Python部分をライブラリ化
  メリット →任意のタイミングでトラッキングデータを収集できる。構成がわかりやすい。
  デメリット→Nugetで取得出来るラッパーライブラリのほうがよくないか。dll作成方法も知らないし、調べるのが面倒。その割に作り始めたらエラー処理考えたり…やっぱ面倒…
 ・Python部分を実行ファイル化
  メリット →ほとんどサンプルソースのまま作れる。非同期なのでCPU資源とか効率的に使えるかも。
  デメリット→やりとりが面倒。同期処理が必要。

 私はPython部分を楽に処理したいためだけに実行ファイル化を選択しました。

Python−Unity間通信はどうするか

 プロセス間通信をどうするか
 同じようにいくつか候補を挙げる
 ・共有メモリ
  メリット →最速
  デメリット→今時使っていいのか?
 ・名前付きパイプ
  メリット →標準
  デメリット→Pythonのパイプ処理調べなきゃ
 ・TCP
  メリット →サンプルが豊富。別のPCに任せてもいい。
  デメリット→速度が…。と言うか今回の用途ではもっといいプロトコルがあるじゃろう?
 ・UDP
  メリット →TCPと一緒、TCPよりはやーい
  デメリット→やっぱ速度が…。

 はい、UDPでいきましょう!

カメラ側処理の作成

・カメラ側処理(Python処理)でフェイストラッキングが正常に実行出来ているか確認
 この部分はサンプルコードをそのまま利用した。
 サンプルURL:
・UDPの送信処理を実装
 IPアドレスとポート番号は固定。
 約470箇所の座標情報を転送フォーマットに変換して送信
・不要な箇所を削除
 フェイストラッキングが正常に出来ているか、画面上に表示していたコードをコメントアウトしておく(うまくトラッキングできないときの確認用)

Unity側処理

・UDP受信部分の作成
 起動メソッドでUDP受信スレッドを作成
・受信した座標データを保管する変数を作成
 ここの読み書きをロックしてスレッドセーフとする。
・アップデートメソッドでモデルに座標データを渡す。

完成物

Test3.gif

(Dlibの名称間違えてましたので直しました)

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?