Imaginary Code

from kougaku-navi.net

Processingでビデオキャプチャを手軽に切り替えられるライブラリ「CaptureSelector」を作りました

先日シリアルポート設定ダイアログを表示できるライブラリを作りましたが、それのビデオキャプチャ版を作りました。下図のような設定ダイアログが表示されて、キャプチャデバイス、サイズ、FPSを自由に切り替えることができます。


ダウンロード

 こちらのページに置いてます: BACKYARD - 工学ナビ

使い方

ダウンロードしたファイルを解凍すると、sampleというフォルダ中に「CaptureSelector.pde」というファイルが入っています。このPDEファイルがライブラリ本体で、これを自分のスケッチに追加して使用します。

CaptureSelectorではドロップダウンリストの表示にControlP5ライブラリを使っています。ProcessingにControlP5がインストールされていない場合は、ProcessingのSketchメニューから「Import Library...」→「Add Library...」とたどり、表示されたリストの中からControlP5を選択してインストールしてください。


以下にサンプルコードを示します。起動するとカメラ画像を表示するウィンドウとキャプチャの設定ダイアログが表示されます。設定を変更するとただちに反映され、入力画像のサイズに応じてウィンドウのサイズを自動変更します。

CaptureSelector selector; // キャプチャセレクタ
Capture prev_cap;  // 前回使用していたキャプチャ

void setup() {
  size(400, 300);
  selector = new CaptureSelector(this);
  selector.show();
}

void draw() {
  // 設定ダイアログから選択されているキャプチャを取得する
  Capture cap = selector.getCapture();
  if ( cap==null || !cap.available() ) return; // キャプチャがnullもしくは画像が準備できていない状態なら抜ける
    
  // 前回と違うキャプチャが選ばれていたらウィンドウのサイズを変更する
  if ( cap != prev_cap ) {
    Insets insets = frame.getInsets();
    cap.read();
    size(cap.width, cap.height);
    frame.setSize( cap.width + insets.left + insets.right, cap.height + insets.top + insets.bottom );
  }

  // キャプチャした画像を表示する
  background(0);
  cap.read();
  image(cap, 0, 0);

  // キャプチャの情報を保持
  prev_cap = cap;
}

// マウスクリックしたら設定ダイアログを表示
void mousePressed() {
  selector.show();
}

書き方について説明します。まずCaptureSelector型の変数を宣言し、setup()のなかでnewします。newするときの引数はthis(PAppletのインスタンス)です。キャプチャ設定ダイアログを表示するにはshow()を使います。show()はいつでも使えて、ダイアログを閉じた後もshow()によって繰り返し表示できます。選択されているキャプチャを取得するにはgetCapturel()を使います。なお、キャプチャの開始処理は選択時にCaptureSelectorの中で行われます。

やっつけ

本当はデバイス名、サイズ、FPSの3つのドロップダウンリストを表示する仕様にしようと思っていたのですが、サイズは選択されているデバイスに、FPSは選択されているサイズによって選択肢が変動するため、選択状況に応じてドロップダウンリストの内容をいちいち更新する必要があります。このへんの処理が面倒だったので、単純にCapture.list()で得られるリストをそのまま表示するだけにしています。