
概要 📖 – 映像の動きを画素ごとに検出
Optical Flow TOPは、連続する映像フレーム間の画素単位の動き (オプティカルフロー) を計算し、R と G チャンネルに 2D 動きベクトルとして出力する TOPです。入力 TOP の前後フレームを比較し、各画素の x 方向の動きを R チャンネルに、y 方向の動きを G チャンネルに出力します。Cost Output を有効化すれば動きベクトルの不確実度を B チャンネルに出力できます。内部で NVIDIA Optical Flow SDK を利用するため、Turing 世代以降の NVIDIA GPU が必要です。
主な用途 🎯
- ライブカメラ映像から画素単位の動きを抽出し、リアクティブな映像演出を駆動
- 動きベクトルを Displace TOP に渡して映像をフレーム間の動きでゆがませる演出
- ダンサーやパフォーマーの動きに反応するパーティクル・流体エフェクトの入力源
- 動きの量を TOP to CHOP で数値化し、音量・ライト強度・センサー閾値に流用
- モーションマスクを生成して「動いた部分だけ」フィルタを通すマット合成
データフロー 🔄
入力: 映像 TOP (Video Device In TOP / Movie File In TOP 等)
↓
直前フレームと現フレームをペアで GPU 解析
↓
出力: 2D 動きベクトル (R = x 方向の動き、G = y 方向の動き、B = 任意で不確実度 cost)
初心者の方は、以下日本語書籍も手元にあると安心です。

実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!
パラメータ解説 ⚙️
Optical Flow Page 📋
Grid Size .gridsize 🔲
出力解像度を決めるグリッド粒度
| 項目 | 内部名 | 説明 |
|---|---|---|
| 1×1 | .grid1x1 |
最小グリッド (最も低速)。出力解像度は入力解像度と同じ |
| 2×2 | .grid2x2 |
中間グリッド。出力解像度は入力解像度の 1/2 |
| 4×4 | .grid4x4 |
最大グリッド (最も高速)。出力解像度は入力解像度の 1/4 |
※ 注意: Turing 世代の NVIDIA GPU は 4×4 のみサポートします。それ以前の GPU では Optical Flow TOP 自体が動作しません。新しい世代の GPU では 1×1 / 2×2 / 4×4 のいずれも使用可能です。
Quality .quality ⚡
オプティカルフローモデルの精度を切替
| 項目 | 内部名 | 説明 |
|---|---|---|
| High | .high |
高精度モデル。動きベクトルが正確になるが計算負荷は最大 |
| Medium | .medium |
中精度モデル。精度と速度のバランス |
| Low | .low |
低精度モデル。最も高速だが粗い結果 |
出力制御 🎚️
Cost Output .costoutput 📊Cost Output (cost 出力) — オンにするとオプティカルフローの「コスト」を B チャンネルに出力します。コストが高いほど R と G チャンネルの動きベクトルの不確実度が高いことを示します。コスト値は 0 から 255 の整数です。
Gain .gain 🔊Gain (出力ゲイン) — R と G チャンネルの動きベクトルに対する出力後乗算係数。gainx は R チャンネル (x 方向の動き)、gainy は G チャンネル (y 方向の動き) に最後に掛け合わされます。動きベクトルを可視化するときに視認しやすい強度に調整するのに使います。
タイミング制御 ⏱️
Manual Timing .manualtiming 🎛️Manual Timing (手動タイミング) — Optical Flow TOP はリアルタイムモードと非リアルタイムモードの両方で動作しますが、入力映像のフレームレートがプロジェクトレートと異なる場合、Manual Timing を有効化することで品質が改善することがあります。有効化時は入力映像フレームごとに秒単位のタイムスタンプを下の Timestamp パラメータに供給する必要があります。映像ストリーミング系 TOP は Info CHOP 経由で timestamp チャンネルを取得できます。
Timestamp .timestamp 🕒Timestamp (タイムスタンプ) — 入力映像フレームの秒単位タイムスタンプ。Manual Timing が有効なときに参照されます。詳細は上の Manual Timing パラメータを参照。
実践アイデア 💡
Example 1: ライブ映像の動き反応 🎥
Video Device In TOP → Optical Flow TOP → Displace TOP → Out TOP
ライブカメラ映像から Optical Flow TOP で画素ごとの動きベクトルを抽出し、Displace TOP の変位マップとして渡して、被写体の動きに反応して映像が歪む演出を作る基本フロー。ダンサーが手を振った方向に背景がゆがむような表現に向きます。
- Video Device In TOP でライブカメラ映像を取得
- Optical Flow TOP の入力に接続し、Grid Size = 2×2 / Quality = Medium に設定
- Gain を 5〜10 程度に上げて動きベクトルを強調
- 出力を Displace TOP の Displace Source に接続
- Displace TOP のソース入力に歪ませたい背景映像を入力
Example 2: 動き量を数値化して制御 📈
Movie File In TOP → Optical Flow TOP → Analyze TOP → TOP to CHOP → Math CHOP
映像ファイルから抽出した動きベクトルの強度を Analyze TOP で平均値に集約し、TOP to CHOP で CHOP 数値に変換して照明強度や音量パラメータの制御信号として流用する用途。映像が活発に動いているフレームほど照明が強くなる、といった連動が組めます。
- Movie File In TOP で解析したい映像を読込み
- Optical Flow TOP に渡し、Cost Output をオフ・Quality を High に設定
- 後段 Analyze TOP の Function を Average にして全画素の動き量を 1 ピクセルに集約
- TOP to CHOP で R / G チャンネルを CHOP 値に変換
- Math CHOP で正規化し他パラメータに Export
Example 3: モーションエコーの作成 🌀
Video Device In TOP → Optical Flow TOP → Feedback TOP (loop) → Composite TOP
Optical Flow TOP の出力を Feedback TOP でループバックして時間的に蓄積し、過去の動きが軌跡として残るモーションエコー (動きの残像) を作る応用。Feedback の Black Level を少し上げると古い軌跡が徐々にフェードアウトします。
- Optical Flow TOP の出力を Feedback TOP の入力に接続
- Feedback TOP の Target TOP を Optical Flow TOP に戻して再帰ループを形成
- Feedback TOP の Black Level を 0.02〜0.05 に設定して古い軌跡を時間で減衰
- Composite TOP で元映像と Over 合成して軌跡を重ねる
関連オペレータ 🔗
類似機能OP 🔍
- Difference TOP — フレーム間の単純な画素差分。動きの「量」を取りたいだけならこちらでも代用可能だが、方向ベクトルは得られない
組み合わせ推奨OP 🔄
- Displace TOP — 動きベクトルを変位マップとして渡し、映像を動きに沿って歪ませる典型的な後段
- Feedback TOP — 動きベクトルを時間方向に蓄積してモーションエコー / 軌跡可視化を作る
- Lookup TOP — 動きの強度をカラーランプにマッピングして方向と速度を色で可視化
- Channel Mix TOP — R と G のベクトル成分を取り出して個別に処理
- Video Device In TOP — リアルタイム解析の入力源 (ライブカメラ)
- Movie File In TOP — 事前収録映像の解析用入力源
前処理・後処理TOP 🎯
- 前処理: Video Device In TOP、Movie File In TOP、Cache TOP、Crop TOP
- 後処理: Displace TOP、Feedback TOP、Lookup TOP、Channel Mix TOP、HSV Adjust TOP、Edge TOP
Info CHOP情報 📊
Optical Flow TOPは Info CHOP による解像度・アスペクト比・GPU メモリ使用量などの詳細情報取得に対応しています。
TOP固有情報 🖼️
resx: TOP の出力解像度 X (ピクセル単位)resy: TOP の出力解像度 Y (ピクセル単位)aspectx: アスペクト比 Xaspecty: アスペクト比 Ydepth: 3D テクスチャ / テクスチャ配列の深度 (2D テクスチャでは 1)gpu_memory_used: TOP が消費している GPU メモリ量 (MB 単位)
汎用オペレータ情報 🔄
total_cooks: プロセス開始からのクック回数cook_time: 最後のクック時間 (ミリ秒)cook_frame: 最後にクックされたフレーム番号warnings: 警告数errors: エラー数
トラブルシューティング ⚠️
よくある問題と解決策 🔧
❌ Problem: 動きベクトルが出ない / 出力が真っ黒
✅ Solution:
- Turing 世代以降の NVIDIA GPU が必要です。それ以前の GPU / AMD GPU では動作しません
- Turing GPU の場合は
Grid Sizeを4x4に固定する必要があります - 入力映像が完全に静止しているとフローはゼロになります。テスト時は手をかざすなど動きを与える
Gainが 0 になっていないか、可視化用に 5〜10 に上げて確認
❌ Problem: ノイズが多い / 動きベクトルがジッタする
✅ Solution:
- 前段に Blur TOP を挟んで入力映像のノイズを抑える
QualityをHighに上げてモデル精度を向上Grid Sizeを1x1に下げて空間解像度を上げる- 後段に Feedback TOP で時間平均を取って揺れを平滑化
❌ Problem: GPU 負荷が高い / フレームレートが落ちる
✅ Solution:
QualityをLowまたはMediumに下げるGrid Sizeを4x4に上げて出力解像度を下げる- 前段 Crop TOP で解析範囲を必要部分だけに絞る
- Common Page の
Output ResolutionをHalf等に下げて後段で拡大
❌ Problem: 映像とフローのタイミングがズレる
✅ Solution:
- 入力映像のフレームレートがプロジェクトレートと異なる場合は
Manual Timingを有効化 - ストリーミング系 TOP の場合は Info CHOP から
timestampチャンネルを取得しTimestampパラメータに接続 - Movie File In TOP 入力なら
Manual Timingはオフのままで通常問題は起きない
参考資料 📚
その他 🔗
- TouchDesigner Wiki — Category:TOPs
- TouchDesigner Wiki — Pixel Formats 解説
- TouchDesigner Wiki ホーム
- TouchDesigner 公式 Forum
- Facebook — TouchDesigner Help Group

