Processinglueには,Processingを出力できる仮想ディスプレイだけでなく,Processingの入力として使うことができる仮想カメラもあります.
Processingでカメラを使う際には processing.video.Captureクラスを使いますが,仮想カメラはCaptureクラスのサブクラスとして実装しているので,同じようにPAppletから扱うことができます.
その一例としてPerfume Official Global Websiteで公開されているPerfumeのモーションデータを再生するProcessingのサンプルを拡張しました.Perfumeの前に仮想カメラを置き,その画像をオプティカルフローを出力するProcessingに渡し,その出力をPerfumeの後ろに置いた大きなディスプレイに出力しました.
右のウィンドウがシミュレーションをするProcessing,左上のウィンドウが画像処理を行っているProcessing,左下のウィンドウが仮想カメラの画像です.
シミュレーションを行うPAppletの中では下記のような手順でインタンスを生成します.
capture = new P4PCapture(this,320,240);//仮想カメラのインスタンスをnew
opticalflow opt = new opticalflow();//オプティカルフローのPAppletをnew
opt.setCapture(capture);//仮想カメラをオプティカルフローのPAppletに渡す
display = new P4PDisplay(this, 1600, 1200, opt, 320, 240, true);//オプティカルフローのPAppletを引数にして仮想ディスプレイのインスタンスをnew
オプティカルフローを計算するProcessingはOpenProcessingで公開されているものを使いました.そのソースの中に画像を反転する/しないを決めるパラメータがありますが,反転せずに出力してみました.
画像処理を使ってビデオエフェクトをかける時には,画像が入れ子になっていくビデオフィードバックがかからないようカメラにフィルタをかけることがあります.ビデオフィードバックがかからないようシミュレーションしてみました.
フィルタをかける/かけないを仮想空間でも可能にするために,PAppletがimplementするインタフェース:Draw2PGraphics3Dを定義してあります.
カメラには写したくない+3D空間の中に表示するものはdraw()の中でhoge.draw();等として描画をします.
カメラに写したい+3D空間の中にも表示したいものはdraw2PGraphics3D()の中でfuga.draw();などとしておき,draw()の中でdraw2PGraphics3D(this);と呼び出すようにしています.
少しややこしい気もするので,写さないオブジェクト/写すオブジェクトをリストで管理しても良いかな…とも思うのですが,PAppletのサブクラスを作って隠蔽することが分かりにくさを生む場合もあると考え,今はこうした実装にしています.
(良い実装の方針があったらぜひ教えて下さい)
Cpatureクラスを使って画像を処理するPAppletは少しだけ拡張を行います.
public boolean realDeployment = false;
という変数と下記のようなメソッドを追加します.
public void setCapture(Capture capture){ // added for P4P
this.video = capture;
}
setup()の中で
if(realDeployment) { // added for P4P
video = new Capture(this, wscreen, hscreen, fps);
video.start();
}
とすることで,シミュレーションの際にはリアルなカメラをnewしないでおき,シミュレーションのコードでnewした仮想カメラをsetCapture(capture);します.
draw()の中で仮想カメラ/リアルカメラからの画像を読み込みますが,
if(realDeployment == true)
video.read();
else
video.loadPixels();
として仮想カメラ/リアルカメラを使い分けています.他の部分は元のソースコードと同じです.こうした実装をすることで
- 仮想カメラからの入力を仮想ディスプレイに出力
- リアルカメラからの入力を仮想ディスプレイに出力
を行ったり来たりしながらプロトタイピングを行い,最終的には
- リアルカメラからの入力をリアルディスプレイに出力
するという形でプロトタイピングを進めることができる,というのがProcessinglueの大きな特長になっています.