mieki256's diary



2012/01/30(月) [n年前の日記]

#1 [processing] 先日作成したストップウォッチを少し高速化

先日、Processingで作成したストップウォッチ?をネットブック機 IdeaPad S10-2で動かしたら全然処理が間に合ってなかったので、少し修正。 しかし問題が。

修正を加える前の予想では、おそらくキーやマウスボタンの割り込みは、表示フレームレートとは無関係に入ってくれるのだろうと。であれば、キー入力等の割り込み内で時間の取得や記録をしたほうが正確さが増すのではないか、と想像して修正したのだけど。期待通りの結果は得られなかった。

どうやら、Processingにおいて、キーやマウスボタンの入力は、表示フレームレートに支配される模様。おそらく、表示フレームレートのタイミングで、キーやマウスの入力結果を取得、もしくはどこかに記録して、それを参照させている。というのも、表示フレームレートを24FPSにすると、時間の取得結果も24FPS単位になり、60FPSにすれば取得結果も60FPS単位になるように見えたからで。

つまり現状の自分の知識では、Processingで厳密に時間を測定するアプリは書けない、と考えたほうが良さそう。まあ、24〜60FPSの精度でも十分なアプリを書くなら問題ないと思うけど。

#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の番組で、映像作家さんが学生さんにデモを見せていたソレを自分もやってみたくて。

こんな感じになった。


/*
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++を使うそうだから、メモリ管理も自由度が高いのではあるまいか。自信はないけど。

以上、1 日分です。

過去ログ表示

Prev - 2012/01 - Next
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project