コンテンツにスキップ

顔に合わせる

Face Detect ノードは映像の中の顔を見つけ、顔の部分のマスクと、顔の位置・大きさの SIG 値を出します。 マスクを Mask Mix と組み合わせると顔だけにエフェクトをかけられ、SIG 値をパラメータへつなぐと顔に追従させられます。

顔の検出には OpenCV の FaceDetectorYN と同じ YuNet モデルを使います。検出は CPU で 1 秒に数回〜数十回動き、描画はそれを待たないので、フレームレートは落ちません。 入力にはどの TEX でも使えます(Camera、Syphon Spout In、Video、Image、他のノードの出力など)。

顔が見えない向き(後ろ姿や横向き)でも追いたいときや、体・手に合わせたいときは Person Detect を使います。

顔だけぼかす

  1. 映像のノード(Camera や Video など)を Face Detect の in と、Blur の in の両方につなぎます。
  2. Mask Mix を追加し、a に元の映像、b に Blur、mask に Face Detect の out をつなぎます。
  3. Mask Mix をセルの Out へつなぎます。

Blur の代わりに Pixelate や Color など、どのエフェクトでも同じように顔だけにかけられます。Mask Mix の invert をオンにすると、逆に顔以外にかかります。

マスクの形は Face Detect の shape(楕円 / 四角)、size(顔の枠に対する倍率)、feather(縁のぼかし)で調整します。 output を overlay にすると、入力に検出した顔の枠を描くので、うまく見つかっているかを確認できます。

顔を顔文字にする

  1. Text ノードを追加し、text に顔文字((^▽^) など)を入れます。顔を覆いたいときは background を好きな色にします。
  2. Text の x と y で IN を押してワイヤーを 1 本ずつ出し、Face Detect の x と y をつなぎます。
  3. size にも Face Detect の w をつなぎ、FX に x * 1500 のような式を書いて、顔の幅に合わせた文字の大きさにします(係数は映像に合わせて調整してください)。
  4. Mask Mix の a に元の映像、b に Text、mask に Face Detect の out をつなぎます。顔の部分だけが顔文字に置き換わります。

mask に Face Detect ではなく Text をつなぐと、文字の形だけを映像に重ねられます。

顔に追従させる

Face Detect の SIG 出力は次のとおりです。

出力 意味
x, y face 番目の顔の中心。−1〜1 で、右・上が正。Transform や Text の x / y と同じ単位なので、そのままつなげます
w, h 顔の幅と高さ(画面の幅・高さを 1 として)。その顔がないときは 0
count 見つかっている顔の数(最大 8)

たとえば Transform の x / y につなげば映像が顔の動きについて動き、GLSL ノードのパラメータにつなげば顔の位置を中心にしたエフェクトを書けます。 face で何番目の顔を追うかを選びます(0 がいちばん長く映っている顔)。マスクには見つかったすべての顔が入ります。

検出の合間は smooth で位置をなめらかにつなぎます。動きの速い映像では下げ、揺れが気になるときは上げてください。 顔を何回か続けて見失っても、少しのあいだは同じ場所に残します(ぼかしが一瞬外れて顔が見えるのを防ぎます)。

頭・体・手に合わせる(Person Detect)

Person Detect ノードは、顔の代わりに人の頭・体・手・顔を見つけます。どれを探すかは target で選びます。 使い方は Face Detect と同じで、out のマスク(output、shape、size、feather)と SIG 出力(x、y、w、h、count)も同じです。追う枠の番号は index で選びます。

target 見つけるもの
head 頭全体(髪や帽子も含む)。後ろ姿・横向きでも見つかるので、ステージ上で動き回る人を追うのに向いています
body 体全体。shape を rect にするとシルエットに近いマスクになります
hand 手。手の位置で映像を動かす、などに使えます
face 顔。Face Detect と違い、頭と同じモデルで見つけます

検出には YOLOX のモデル(PINTO_model_zoo の YOLOX-Body-Head-Hand-Face-Dist)を使います。Face Detect より少し重いので(検出の間隔が長くなるだけで、フレームレートは落ちません)、正面の顔だけを追うなら Face Detect のほうが向いています。 遠くの人を拾いたいときは threshold を下げ、誤検出が気になるときは上げてください。

動いているものに合わせる(Blob Detect)

Blob Detect ノードは、顔や人の形ではなく動いているもの(覚えている背景と違う部分)を見つけます。手を振る、物を動かす、ライトを当てるなど、何が映っていても使えます。 使い方は Face Detect と同じで、out のマスクと SIG 出力(x、y、w、h、count)も同じです。追う blob の番号は blob で選びます。

  1. Camera などの映像を Blob Detect の in につなぎ、output を overlay にします(最初から overlay です)。
  2. 画面から人や動くものをどけて、capture を一度オンにしてからオフに戻します。そのときの映像が背景になります。
  3. 映像の中で動くと、動いた部分に枠が出ます。

うまく拾えないときは output を motion にすると、背景と違うとみなした部分が白く見えます。 ノイズが白く出るときは threshold か blur か min size を上げ、動きが途切れるときは threshold を下げてください。 ベルトコンベアの織り目のような細かい模様が動く映像でも、blur(最初は 2)でぼかしてから比べるので、模様の動きは拾いません。暗い部分のように背景と色が近い部分は threshold を下げると拾えます。 learn は背景を今の映像に近づける速さです。止まった人や置いた物もしばらくすると背景になり、拾われなくなります。照明が変わる場所では少し上げ、止まったものも拾い続けたいときは 0 にします。 大きな部分がまとめて変わる(照明が切り替わる、水面に映り込む)のを拾わないようにするには、max size を下げます。

定点カメラの道路の車を追う

高速道路を定点で撮った映像の車のように、小さいものがたくさん動く映像では、次のように設定します。

パラメータ 値 理由
blur 1 2 だと小さい車がぼけて消えます
clean 0 数画素しかない遠くの車を消さないように
threshold 0.08 くらい 夜の車のライトは背景との差がはっきりしているので低めでも大丈夫です
min size 0.00005〜0.0002 小さい車も残します。誤検出が多いときは上げます
max size 0.01 くらい 橋の照明の切り替わりなど、大きな変化を外します
learn 0.005 くらい 渋滞で止まった車もしばらくは拾い続けます
left / right / top / bottom 映像に合わせて 時計や天気などの重ねた表示を範囲の外にします

blob は大きい順に最大 32 個まで追います。近くを走る車が 1 つにまとまるときは join を下げます。

背景を覚えにくい映像(カメラが動く、映像が切り替わる)では、mode を motion にすると、直近 frames フレームの平均と比べて、いま動いている部分だけを拾います(Delay と Blend の Difference を組み合わせるのと同じですが、30fps の映像を 60fps で回しても点滅しません)。止まった車は拾いません。