#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に置き換えればよい。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS