第5回: TOPでインタラクティブなエフェクトを作る
今回はTOPを使ったインタラクティブなエフェクトを作る基本的な方法をいくつか紹介したいと思います
背景差分法
/project1/BACKGROUND_SUBTRACTION
を参照
最初に、画像の中から動いている部分を抜き出す一番簡単な方法の、背景差分法を見てみましょう。
考え形としては非常に簡単で、何も写っていない画像
- 何かが写っている画像
= 何か
という流れで背景でない領域を抜き出せます。
背景の画像に関しては、Movie File Out TOP
などで何も写っていない時の静止画をファイルに書き出してそれを使ってもいいのですが、TOPオペレーターのLock機能を使うと適当なフレームの画像を保持しておけるのでとりあえず試す時はそちらのほうが簡単です
動画の入力と背景の画像を Subtract TOP
に入力すると注目すべき部分のみの画像が得られます。それをBlur TOP
や Threshold TOP
を使ってノイズ成分を減らします。
Blob Track TOP
を使うと、抜き出した画像のエリアから中心点などの情報を取得することもできるのですが、まだ DAT
の説明をしていないのでこのあたりはまたの機会に…
フレーム差分法
/project1/FRAME_SUBTRACTION
を参照
次に、フレーム間の差分をとって動いている部分を検出するフレーム差分法を解説します。
こちらのほうは背景差分法よりもさらにシンプルで、現在のフレーム
- 前のフレーム
= 動いた箇所
というふうな考え形になります。
以前のフレームというのはTOPでは、Cache TOP
を使うことで表現できます。最大 Cache > Cache Size
分のフレームを覚えておいて、 Cache > Output Index
で取得したいフレームのオフセットを指定するとその分だけ遅れたフレームを得ることができます。
今回のテスト動画だと、動画のフレームレートが10fpsだったのに対して、TouchDesginerは60fpsで動いているので -6
を指定すると1つ前のフレームを取得できました。
それらをまた Subtract TOP
に接続することで、動いている部分を得ることができます。
Feedback TOP
/project1/TOP_FEEDBACK
を参照
Feedback TOP
を使うと、TOPの処理の1つ前のフレームを取得できます。
取得したフレームをどう使うかに関してはアイディア次第なのですが、現在のフレームと合成することで残像のようなエフェクトを簡単に作ることができます。
また、Feedback TOP
の代りに Cache TOP
を使うこともできます。この場合 Cook dependency loop detected
というWarningが出てしまいますが、多分気にしなくても大丈夫です。
Cache TOP
を使ったほうが1フレームより前の画像を取得できるのでより色々な表現ができそうです。
やってみよう
effect_start
effect_end
の間に色々とTOPオペレーターを追加して、どういうエフェクトができるか色々試してみてください。
Composite TOP
のブレンドモードを変更しても色々と効果がかわってくるはずです
フレーム差分法を使ったエフェクト
/project1/FRAME_SUBTRACTION_SMOKE
を参照
フレーム差分法とFeedback TOP
を組み合わせて、動いている人の回りに煙のようなエフェクトが出るサンプルを作りました。色々とパラメーターを変更したり、オペレーターをBypassしてみたりして、どういう風な動きになっているかを見てみてください。
変更されたパラメーターの表示
パラメーターウィンドウの右上の Non-default Parameter Only
ボタンを押すと、デフォルトの値から変更されたパラメーターのみが表示されます。人の作ったネットワークを読み解く時に非常に便利なので、あわせて試してみてください