Imaginary Code

from kougaku-navi.net

ProcessingのCaptureがうまく動かないときの他の選択肢

Processingのビデオキャプチャ(Capture)がうまく動かない事案はしばしば発生します。対処用にビデオキャプチャのライブラリを2種類作りましたので、ダメだったときに試してみてください。

(2023/6/14追記)3番目の方法として OpenCV for Processing を使う方法を追加しました。

PCapture を使う

Java向けに書かれたビデオキャプチャライブラリである Webcam Capture API をProcessingに移植したのがPCaptureです。Captureクラスとほぼ同じAPIなので、置き換えはしやすいはず。
 
github.com

インストール方法

  1. https://github.com/kougaku/pcapture にアクセス。
  2. Releases のページから最新版の PCapture.zip をダウンロードし、展開する。
  3. スケッチブックの場所(デフォルトであれば、ドキュメントフォルダ内のProcessingフォルダ)にあるlibrariesフォルダを開く。
  4. そこへ先ほど展開した PCapture フォルダを入れる。
  5. Processing を起動して、スケッチ > ライブラリをインポート... の中に PCapture がいればインストール成功。

コード例

import pcapture.*;

PCapture cam;

void setup() {
  size(640, 480);

  // 画像サイズ640x480
  cam = new PCapture(this, 640, 480);

  // 画像サイズ640x480、0番目のデバイスを使用
  // cam = new PCapture(this, 640, 480, PCapture.list()[0]);

  cam.start();
}

void draw() {
  if ( !cam.available() ) return;
  cam.read();
  image(cam, 0, 0);
}

// captureEvent() も使える
/*
void captureEvent(PCapture cap) {
  cap.read();
}
*/

注意点

Webcam Capture APIにフレームレートを設定するAPIがなかったので、PCaptureのframeRate()メソッドの中身は未実装です。
 
 

JcvCapture を使う

JavaCVというOpenCVJavaラッパーライブラリがあるのですが、それのキャプチャ機能のみをProcessing向けに移植したのがJcvCaptureです。内部で使用するキャプチャのライブラリをVideoInputとOpenCVの2種類から選べるようにしました。
 
github.com

インストール方法

  1. https://github.com/kougaku/jcvcapture にアクセス。
  2. Releases のページから最新版の JcvCapture.zip をダウンロードし、展開する。
  3. スケッチブックの場所(デフォルトであれば、ドキュメントフォルダ内のProcessingフォルダ)にあるlibrariesフォルダを開く。
  4. そこへ先ほど展開した JcvCapture フォルダを入れる。
  5. Processing を起動して、スケッチ > ライブラリをインポート... の中に JcvCapture がいればインストール成功。

コード例

import jcvcapture.*;

JcvCapture cam;

void setup() {
  size(640, 480);
  
  // 画像サイズ640x480
  cam = new JcvCapture(this, 640, 480); 

  // 画像サイズ640x480、0番目のビデオデバイス
  // cam = new JcvCapture(this, 640, 480, 0);

  // 画像サイズ640x480、0番目のビデオデバイス、キャプチャにVideoInputを使用
  // cam = new JcvCapture(this, 640, 480, 0, JcvCapture.VIDEOINPUT);

  // 画像サイズ640x480、0番目のビデオデバイス、キャプチャにOpenCVを使用
  // cam = new JcvCapture(this, 640, 480, 0, JcvCapture.OPENCV);
  
  cam.frameRate(30);
  cam.start();
}

void draw() {
  cam.read();
  image(cam, 0, 0);
}

注意点

JcvCaptureには、Captureにあったavailable()やcaptureEvent()コールバックはないので、Captureからの置き換えの際はご注意ください。

OpenCV for Processing を使う(2023/6/14追記)

OpenCV for ProcessingはJava版のOpenCVをProcessingで使えるようにしたラッパーライブラリです。これをインストールすると、Java版のOpenCVAPIも使えるようになります。OpenCVにはVideoCaptureというビデオキャプチャを扱うためのクラスがあるので、これを使います。

インストール方法

  1. Processing のメニューで、スケッチ > ライブラリをインポート... > Manage Libraries ... とたどる。
  2. Contribution Manager が表示されたら、Filter のところに opencv と入力し、一覧に「OpenCV for Processing」が出てきたらそれを選択し、 Install ボタンを押す。
  3. インストール処理が終わったら、Processing のメニューで スケッチ > ライブラリをインポート... とたどり、メニューの中に OpenCV for Processing がいればOK。もしいない場合はProcessingを再起動して再確認。

コード例

import gab.opencv.*;            // OpenCV for Processing
import org.opencv.core.*;       // OpenCVの基本機能
import org.opencv.videoio.*;    // OpenCVのビデオ入出力機能

OpenCV opencv;
VideoCapture cap;
Mat frame;

void setup() {
  size(640, 480);
  
  // OpenCVの初期化
  opencv = new OpenCV(this, 0, 0);

  // 設定に時間がかかる場合があります
  cap = new VideoCapture(0);                    // 0番目のデバイスを使用
  cap.set(Videoio.CAP_PROP_FRAME_WIDTH, 640);   // 横幅を640に設定
  cap.set(Videoio.CAP_PROP_FRAME_HEIGHT, 480);  // 高さを480に設定
  cap.set(Videoio.CAP_PROP_FPS, 30);            // 速度を30fpsに設定

  // 画像の初期化
  frame = new Mat();
}

void draw() {
  cap.read(frame);                          // 画像の読み込み
  if ( !frame.empty() ) {                   // 読み込んだ画像が空でなければ
    PImage img = opencv.getSnapshot(frame); // MatからPImageへの変換
    image(img, 0, 0);                       // 画像の表示
  }
}

ポイント

OpenCVのVideoCaptureから得られるデータはPImageではなくMatなので、上記のようにMat→PImageの変換が必要になります(たった一行で済みますが)。