2012/01/30(月) [n年前の日記]
#2 [processing] Processing+Webカメラで少し実験
せっかくProcessingを触ってみたのだから、Webカメラの映像を処理してみたいなと。Windows7 x64 + Processing 1.5.1 + Logicool Qcam S7500 の環境で実験。
Windows環境上のProcessingでWebカメラを扱う場合は、WinVDIGなるものが必要らしい。最新版では不具合があり、1.0.1じゃないと正常動作しない、と言及している記事が多いので、自分もそれに従い、WinVDIG_101.exe をDLしてインストールしてみた。
サンプルを動かしたら一応動いてくれた。が、問題が。
色々動かしているうちにProcessingが固まってしまう。一度固まるとタスクマネージャからも終了できない。OS再起動を試みるものの該当プロセスだけが強制終了できない状態に陥るようで、「シャットダウンしています」の表示の後、うんともすんとも言わなくなる。仕方ないのでリセットスイッチを押すしかないが、そんな場面が二度ほどあった。
もしかすると、LogicoolのWebカメラはこの手の実験に使うにはあまりよろしくないのかもしれない。Logicoolの窓口では、UVCなる規格に正式対応していない・動作保障外としている、という話も見かけた。そのあたりが絡んでいるのかもしれず。しかし、かといって、個人的には滅多に使わないWebカメラという機器を、またもう一台購入し直すのもなんだかもったいないし。
とりあえず、おっかなびっくり Qcam S7500 を使って、簡単なテストプログラムを書いた。昔NHKの番組で、映像作家さんが学生さんにデモを見せていたソレを自分もやってみたくて。
こんな感じになった。
ただ、上記のソース中の過去画像記憶枚数を増やそうとすると、メモリが足りないと怒られてしまう。記憶できる過去画像の枚数がこれ以上確保できないということは、ウインドウサイズを640x480(VGA)などにはできないということ。縦のドット数以上の過去画像記憶枚数が必要になるはずだから。この環境では、せいぜい320x240(QVGA)で動かすのが関の山らしい。
これ以上何かしようとするなら、openFrameworks なるものに手を出したほうがいいのかもしれない。そっちなら、Webカメラの制御もDirectなんとかを使っているらしいから、今ほど固まったりしないのかもしれないし。また、C/C++を使うそうだから、メモリ管理も自由度が高いのではあるまいか。自信はないけど。
Windows環境上のProcessingでWebカメラを扱う場合は、WinVDIGなるものが必要らしい。最新版では不具合があり、1.0.1じゃないと正常動作しない、と言及している記事が多いので、自分もそれに従い、WinVDIG_101.exe をDLしてインストールしてみた。
サンプルを動かしたら一応動いてくれた。が、問題が。
色々動かしているうちにProcessingが固まってしまう。一度固まるとタスクマネージャからも終了できない。OS再起動を試みるものの該当プロセスだけが強制終了できない状態に陥るようで、「シャットダウンしています」の表示の後、うんともすんとも言わなくなる。仕方ないのでリセットスイッチを押すしかないが、そんな場面が二度ほどあった。
もしかすると、LogicoolのWebカメラはこの手の実験に使うにはあまりよろしくないのかもしれない。Logicoolの窓口では、UVCなる規格に正式対応していない・動作保障外としている、という話も見かけた。そのあたりが絡んでいるのかもしれず。しかし、かといって、個人的には滅多に使わないWebカメラという機器を、またもう一台購入し直すのもなんだかもったいないし。
とりあえず、おっかなびっくり Qcam S7500 を使って、簡単なテストプログラムを書いた。昔NHKの番組で、映像作家さんが学生さんにデモを見せていたソレを自分もやってみたくて。
こんな感じになった。
/* Webカメラからキャプチャするサンプル */ import processing.video.*; //キャプチャする映像のオブジェクトを用意 Capture cap; // 過去画像記憶用 PImage[] pic = new PImage[0x100]; // 動画保存用 //MovieMaker mm; int idx; boolean rec; // 初期設定 void setup() { size(320, 240); // Webカメラからキャプチャする映像の設定 cap = new Capture(this, width, height, 30); for (int i=0; i < pic.length; i++ ) { pic[i] = createImage(width, height, RGB); } idx = 0; // 動画保存用 // mm = new MovieMaker(this, width, height, "sample.mov", // 24, MovieMaker.MOTION_JPEG_A, // MovieMaker.BEST); frameRate(24); rec = true; } // 毎フレーム呼ばれる処理 void draw() { // 現在のキャプチャ画像を記憶 pic[idx].loadPixels(); cap.loadPixels(); for ( int i=0; i < cap.pixels.length; i++ ) { pic[idx].pixels[i] = cap.pixels[i]; } pic[idx].updatePixels(); // 1ラスター毎に過去の画像を辿りながら画面に描画 for ( int y=0, j = idx; y < height; y++ ) { for ( int x=0; x<width; x++ ) { set(x, y, pic[j].get(x, y)); } j = (j-1) & 0x00ff; } idx++; if ( idx >= pic.length ) { idx -= pic.length; } // 動画として保存 // if ( rec ) { // mm.addFrame(); // } } // Webカメラから映像を読み込み void captureEvent(Capture cap) { cap.read(); } // マウスボタンクリック時の処理 void mousePressed() { // カメラ設定呼び出し // myCapture.settings(); // if ( rec ) { // mm.finish(); // 動画書き出し // } // rec = false; } // キーボードを押した時の処理 void keyPressed() { // if ( rec ) { // mm.finish(); // 動画書き出し // } // rec = false; }ようやく動かすことができた。結構満足。
ただ、上記のソース中の過去画像記憶枚数を増やそうとすると、メモリが足りないと怒られてしまう。記憶できる過去画像の枚数がこれ以上確保できないということは、ウインドウサイズを640x480(VGA)などにはできないということ。縦のドット数以上の過去画像記憶枚数が必要になるはずだから。この環境では、せいぜい320x240(QVGA)で動かすのが関の山らしい。
これ以上何かしようとするなら、openFrameworks なるものに手を出したほうがいいのかもしれない。そっちなら、Webカメラの制御もDirectなんとかを使っているらしいから、今ほど固まったりしないのかもしれないし。また、C/C++を使うそうだから、メモリ管理も自由度が高いのではあるまいか。自信はないけど。
[ ツッコむ ]
以上です。