ProcessingのCaptureがうまく動かないときの他の選択肢
Processingのビデオキャプチャ(Capture)がうまく動かない事案はしばしば発生します。対処用にビデオキャプチャのライブラリを2種類作りましたので、ダメだったときに試してみてください。
(2023/6/14追記)3番目の方法として OpenCV for Processing を使う方法を追加しました。
PCapture を使う
Java向けに書かれたビデオキャプチャライブラリである Webcam Capture API をProcessingに移植したのがPCaptureです。Captureクラスとほぼ同じAPIなので、置き換えはしやすいはず。
github.com
インストール方法
- https://github.com/kougaku/pcapture にアクセス。
- Releases のページから最新版の PCapture.zip をダウンロードし、展開する。
- スケッチブックの場所(デフォルトであれば、ドキュメントフォルダ内のProcessingフォルダ)にあるlibrariesフォルダを開く。
- そこへ先ほど展開した PCapture フォルダを入れる。
- 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(); } */
JcvCapture を使う
JavaCVというOpenCVのJavaラッパーライブラリがあるのですが、それのキャプチャ機能のみをProcessing向けに移植したのがJcvCaptureです。内部で使用するキャプチャのライブラリをVideoInputとOpenCVの2種類から選べるようにしました。
github.com
インストール方法
- https://github.com/kougaku/jcvcapture にアクセス。
- Releases のページから最新版の JcvCapture.zip をダウンロードし、展開する。
- スケッチブックの場所(デフォルトであれば、ドキュメントフォルダ内のProcessingフォルダ)にあるlibrariesフォルダを開く。
- そこへ先ほど展開した JcvCapture フォルダを入れる。
- 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版のOpenCVのAPIも使えるようになります。OpenCVにはVideoCaptureというビデオキャプチャを扱うためのクラスがあるので、これを使います。
インストール方法
- Processing のメニューで、スケッチ > ライブラリをインポート... > Manage Libraries ... とたどる。
- Contribution Manager が表示されたら、Filter のところに opencv と入力し、一覧に「OpenCV for Processing」が出てきたらそれを選択し、 Install ボタンを押す。
- インストール処理が終わったら、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の変換が必要になります(たった一行で済みますが)。