#author("2019-05-21T23:09:35+09:00","default:qua","qua") #author("2019-05-21T23:10:04+09:00","default:qua","qua") #navi(Processing/3.ライブラリの利用) * 3-2 ビデオライブラリ [#bc7f9f31] VideoライブラリはファイルやWebカメラからの動画を扱うことができるライブラリである。 次の例は動画ファイルを読み込んで、それを表示する。動画のパス z:/Videos/douga.mp4 は適宜設定すること。なお、スケッチを保存してできるフォルダの中にdataという名前のフォルダを作成し、そこに置いたファイルであれば、ファイル名だけでよい。 mov.loop()は動画を繰り返し再生する。その代わりにmov.play()とすると、動画は1回だけ再生される。mov.available()で動画の次のコマが利用可能な状況であることを取得する。取得可能であれば、mov.read()で読み込んで、image(mov...)で表示する。 import processing.video.*; Movie mov; void setup(){ size(640, 360); mov = new Movie(this,"z:/Videos/douga.mp4"); mov.loop(); } void draw(){ if( mov.available() ){ background(0); mov.read(); image( mov, 0, 0, width, height ); } } 上の例では、画面の大きさに合わせて動画を拡大・縮小して表示する。 Processingの現バージョンでは、size()に変数を指定できないので、前もって動画の大きさがわかればそれを設定する。 もし、プログラム上で画面の大きさを動画の大きさに合わせたければ、次のようにmov.width, mov.heightで動画の大きさを得て、surface.setSize()で画面の大きさを設定する。 import processing.video.*; Movie mov; void setup(){ size( 200, 200 ); mov = new Movie(this,"z:/Videos/douga.mp4"); mov.loop(); surface.setResizable( true ); while( !mov.available() ){ delay( 10 ); } mov.read(); surface.setSize( mov.width, mov.height ); mov.jump( 0 ); surface.setResizable( false ); } void draw(){ if( mov.available() ){ background(0); mov.read(); image( mov, 0, 0, width, height ); } } Image(mov,...)で画像を表示する代わりに、画像処理を行うことで、動画を加工して表示させることができる。次の例は、モザイク表示をする。int block=20でモザイクの大きさを20ピクセルに設定している。mov.get(i, j)で動画のコマの点(i, j)の色を取得し、一辺blockの正方形をその色で塗りつぶす。for(i=0; i<width; i+=block)は、iを0からwidthまでblockだけ増加させていく繰り返しを表す。 特に設定しなければ、動画と画面の大きさが異なるので、x = int( map(i, 0, width, 0, mov.width) )で、画面の横の位置iを動画の横の位置xに変換している。 import processing.video.*; Movie mov; int block = 20; void setup(){ size( 400, 300 ); mov = new Movie(this, "z:/Videos/douga.mp4"); mov.loop(); } void draw(){ int x, y; if( mov.available() ){ background(0); mov.read(); noStroke(); for( int i=0; i<width; i+=block ){ for( int j=0; j<height; j+=block ){ x = int( map(i, 0, width, 0, mov.width) ); y = int( map(j, 0, height, 0, mov.height) ); fill( mov.get(x, y) ); rect( i, j, block, block ); } } } } パソコンにカメラがついていれば、ファイルの代わりにカメラで撮影した動画を扱うことができる。 import processing.video.*; Capture cam; void setup(){ size(640, 360); cam = new Capture(this); cam.start(); surface.setResizable( true ); surface.setSize( cam.width, cam.height ); surface.setResizable( false ); } void draw(){ if( cam.available() ){ background(0); cam.read(); image( cam, 0, 0, width, height ); } } MovieをCaptureに、loopまたはplayをstartに置き換えればよい。