第5回: TOPでインタラクティブなエフェクトを作る

今回のプロジェクトファイル

今回はTOPを使ったインタラクティブなエフェクトを作る基本的な方法をいくつか紹介したいと思います

背景差分法

/project1/BACKGROUND_SUBTRACTION を参照

最初に、画像の中から動いている部分を抜き出す一番簡単な方法の、背景差分法を見てみましょう。

考え形としては非常に簡単で、何も写っていない画像 - 何かが写っている画像 = 何か という流れで背景でない領域を抜き出せます。

背景の画像に関しては、Movie File Out TOP などで何も写っていない時の静止画をファイルに書き出してそれを使ってもいいのですが、TOPオペレーターのLock機能を使うと適当なフレームの画像を保持しておけるのでとりあえず試す時はそちらのほうが簡単です

動画の入力と背景の画像を Subtract TOP に入力すると注目すべき部分のみの画像が得られます。それをBlur TOPThreshold 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 ボタンを押すと、デフォルトの値から変更されたパラメーターのみが表示されます。人の作ったネットワークを読み解く時に非常に便利なので、あわせて試してみてください