Wednesday, June 18, 2014

第10回Webカメラの活用

Pd-extended+GEMでは、ラップトップパソコンについているカメラやUSB接続のWebカメラからの映像入力を処理することができます。
今回はこのカメラの映像を利用して、動きを検知する方法を学びます。

授業資料pd_lesson10.zipをダウンロードしてください。

動きを検知する

pd_lesson10_camera1.pdを開きます。


このパッチはWebカメラからの映像入力を解析して、動きのある部分のみを白く表示します。
カメラはノートパソコンについているWebカメラ(MacbookであればFacetimeのカメラ)や、USB接続のWebカメラを使用できます。
[pix_video]からのカメラ映像入力を[pix_grey]でグレー基調の映像にしています。これにより処理が軽くなります。
[t a a](trigger anything anything)と[pix_separator]でGEMリストを分けた後に、[pix_diff]で1フレーム前のコマとの差分、すなわち動きのあるパートのみを演算して出力します。
[pix_threshould]は通過させる映像の明るさの閾値を設定します。

※[pix_video]は通常は自動的にWebカメラからの入力を認識します。[dialog( メッセージを送ると設定画面が開きます。詳細は[pix_video]のヘルプファイルをチェックしてください。
※USB接続のWebカメラの場合は、映像の解像度やUSBの転送速度によっては映像の再生がもたる場合があります。


[pix_movement]で動きを検知する

pd_lesson10_camera2.pdを開きます。
[pix_diff]と[pix_threshould]での機能を1つのオブジェクトで実現したのが[pix_movement]です。
右インレットで閾値も設定できます。
ただし、見え方は[pix_diff]を使った場合と少し異なります。
[alpha]をつけると映像に透明度の機能を付加できます。[alpha]のON/OFFで差分の映像を見せるか見せないかが選択できます。


検知した動きで赤い円を動かす

pd_lesson10_camera3.pdを開きます。
このパッチは画面内の差分の範囲を検知して、赤い円を描画します。
[pix_blob]は動きのあった範囲の中心のXとY座標,サイズの数値をアウトレットから出力します。
このX,Yの数値を、右側のGEMチェーンの中の円の描画の[translateXYZ]のX,Yに割り当てています。
赤い円が画面内に表示されるようにスケーリングをしていますが、画面の差分の検知の具合によっては画面の外に赤い円が表示されることがあります。その場合はスケーリングの数値を変更してみてください。



赤い円がはみ出ないようにする

pd_lesson10_camera4.pdを開きます。
サブパッチ[pd_xyz]の中ではみ出ないような処理をしています。[max][min]で最大値、最小値を設定しているのがポイントです。
この部分はヘルプブラウザのGem/examples/video/06.frame_diff_tracking.pdの中からコピペして持ってきました。

背景を設定してから検知する

pd_lesson10_camera5.pdを開きます。
背景を設定してから、それ以外を検知する[pix_background]を使うと、背景と異なる動きをする像が差分になります。[pix_blob]はその動きのある範囲の中心を検出します。
このパッチは背景差分の左右の移動で、サイン波のピッチを変化させています。

色を検知する

pd_lesson10_camera6.pdを開きます。
今度はカメラ映像内の色を検出しています。ちょうど画面中央の色を[pix_data]で検出して、右側のGEMチェーンの円の色として描画しています。[pix_data]につながっている[metro]をONにすると、検出がスタートします。
ここで注意が必要なのは、映像のデータ形式の取り扱いです。

※[pix_video]からのカメラ映像はYUVというで形式です。しかし、[pix_data]は静止画に使用されるRGB形式のデータの処理をします。YUVデータの処理はできません。そこで[pix_rgba]でYUVからRGBデータへと変換しています。


色の変化で音をコントロールする

pd_lesson10_camera7.pdを開きます。
色の変化のRGBの数値を、FM音源の周波数のパラメータのコントロールに使っています。

検知した色で全体の色を変更する

pd_lesson10_camera8.pdを開きます。
さらに検知した色が、画面全体の色合いを変更するようにカメラ映像を貼付けるパートの[color]に接続しています。[alpha]は透明度を設定しています。


チャレンジ

色の変化によって画面全体の形が変化するような構造に改造してみましょう。
[scale]][translateXYZ][rotateXYZ]などが使えるでしょう。