はじめに
今回は顔の検出までです。
モデルを動かすのは次回書きます。
一応、成果物のGIFは下の方に載せます。
Unity初心者なので間違いなどがあったら教えていただけると幸いです。
なぜFaceOSCなのか
Unityで顔検出をしたいと思ったのに、
Facetrackerが有料だし、
OpenCVも有料だったので、
OSSであるFaceOSCを使いました。
そこでUnityからFaceOSCを使う際に、
Unityパッケージを作って公開したので紹介します。
OSCの受信はUnityOSCが有名なようですが、
凹みTipsさんのuOSCが使いやすかったので、
今回はこちらを使用しています。
UFaceOSC
今回作ったUnityパッケージです。
uOSCでFaceOSCから受信したOSCメッセージをパースします。
Unityは経験が少ないので、バグなどあったらプルリクいただければ幸いです。
まだ/raw
の取得にバグがあるかもしれません。
環境
使い方
- uOSCとUFaceOSC、FaceOSCをそれぞれGitHubからダウンロード
- 新規Unityプロジェクトを作成
-
[Assets] => [Import Package] => [Custom Package...]
でuOSCとUFaceOSCをインポート -
[GameObject] => [Create Empty]
でゲームオブジェクトを作成 - 作成したゲームオブジェクトを選択して
Inspector
のAdd Componet
から[Scripts] => [uOSC] => [uOscServer]
でアタッチ - Portには
8338
を入力 -
Add Componet
から[New Script]
で新規のスクリプトを作成(今回はmain
という名前で作りました) - 作ったスクリプトに以下のサンプルプログラムを入力
- FaceOSCを起動してrawのチェックボックスをオンにする
- UnityのRunボタンを押す
using System.Collections;
using UnityEngine;
using uOSC;
using UFaceOSC;
public class main : MonoBehaviour {
private UFaceOSC.Parser faceOscParser;
void Start()
{
// UFaceOSCのパーサクラスを初期化
faceOscParser = new UFaceOSC.Parser();
// uOscServerコンポーネントを取得して受信時のコールバック関数を設定
var server = GetComponent <uOscServer>();
server.onDataReceived.AddListener(OnDataReceived);
}
void OnDataReceived(Message message)
{
// パーサクラスにOSCアドレスとOSCメッセージを渡す
faceOscParser.SetData(message.address, message.values);
if(faceOscParser.found == 1) {
// FaceOSCから受信した顔の頂点情報を取得
float[] raw = faceOscParser.raw;
// or Vector2[] rawPoints = faceOscParser.GetRawPoints();
// FaceOSCから受信した口の高さを取得
float mouthHeight = faceOscParser.gesture.mouth.height;
}
}
}
UFaceOSC詳細
UFaceOSC.Parserクラスのメンバ変数はFaceOSCの下記のOSCメッセージアドレスに基づいています。
口の高さなら/gesture/mouth/height
なのでfaceOscParser.gesture.mouth.height
、
右目の開き具合なら/gesture/eye/right
なのでfaceOscParser.gesture.eye.right
となります。
また、/pose/position
はVector2
、/pose/orientation
はVector3
で返します。
/raw
に限ってVector2[]
を返すGetRawPoints()
メソッドを用意しました。
raw
のペアの数は66です。この定数はUFaceOSC.Parser.POINTS_LENGTH
から読み込みも可能です。
- Pose
- center position: /pose/position
- scale: /pose/scale
- orientation (which direction you're facing): /pose/orientation
- Gestures
- mouth width: /gesture/mouth/width
- mouth height: /gesture/mouth/height
- left eyebrow height: /gesture/eyebrow/left
- right eyebrow height: /gesture/eyebrow/right
- left eye openness: /gesture/eye/left
- right eye openness: /gesture/eye/right
- jaw openness: /gesture/jaw
- nostril flate: /gesture/nostrils
- Raw
- raw points (66 xy-pairs): /raw
成果物
今回の環境 + Live2Dを使ってVTuberっぽいのをやってみました。
使用したモデルはLive2Dが公開しているサンプルを使用しています。
長くなってしまったので、その辺は次回書きます。
感想
UnityでFaceOSCを使う例はあったが、オープンソースなものは見当たらなかった。
想像以上のUnity疲れ(便利なんだけどね)。
次回はマスコットキャラ的な奴を動かしたい。