#概要
Processingで外付けのWebカメラから映像を取得するのに手こずった時のメモです。
macbookの内臓カメラではなく、どうしても外付けを使わなくてはならなかったのですが、macと外付けのWebカメラはどうやら相性がよろしくないようです。案の定カメラをUSBポートにそのまま差し込んでも認識しませんでした。今のところ最善と思われる解決方法として、CamTwistを使う方法を解説します。
#開発環境
macOS
Processing3
logicool C270n
CamTwist 3.4.3
#Cam Twistをダウンロードする
CamTwistのサイトからソフトをダウンロードします。インストーラーの指示通りインストールしてください。
http://camtwiststudio.com/
インストールできたら、Video SourcesでWebcamを選択します。するとSettingsでCameraが選択できます。ここに接続したWebカメラが表示されるはずです。接続しているカメラを選択してください。
#
これでCam Twistでの設定は終わりです。(これでmacは接続したWebカメラを認識したので、FaceTimeやQuickTime Playerでも外付けWebカメラを使用できるようになっています。)
この時Cam Twistを終了しないでください。Processingを実行している間中ずっと立ち上げたままにしておきます。
#Processingで外付けWebカメラの映像を読み込んでみる
Processingのサンプルを使ってみます。[ファイル]->[サンプル] ライブラリ/Video/Capture/GettingStartedCaptureでサンプルコードを開きます。
一度これを実行してください。
しばらくするとコンソールに
[0] "name=FaceTime HD Camera,size=1280x720,fps=30"
(略)
[24] "name=USB Camera,size=1280x960,fps=30"
[25] "name=USB Camera,size=1280x960,fps=15"
[26] "name=USB Camera,size=1280x960,fps=1"
(略)
[47] "name=CamTwist,size=80x60,fps=1"
というような感じで、ずら〜っと認識したカメラのリストが出力されます。
これはString[] cameras = Capture.list();の部分で取得しています。
今回の場合でいうとUSBカメラの[24]とか[25]、[26]を使えば良いので、
cam = new Capture(this, cameras[0]);
を
cam = new Capture(this, cameras[24]);
に書き換えます。この数字はコンソールを読んで、接続しているカメラに適宜合わせてください。
/**
* Getting Started with Capture.
*
* Reading and displaying an image from an attached Capture device.
*/
import processing.video.*;
Capture cam;
void setup() {
size(640, 480);
String[] cameras = Capture.list();
if (cameras == null) {
println("Failed to retrieve the list of available cameras, will try the default...");
cam = new Capture(this, 640, 480);
} if (cameras.length == 0) {
println("There are no cameras available for capture.");
exit();
} else {
println("Available cameras:");
printArray(cameras);
// The camera can be initialized directly using an element
// from the array returned by list():
cam = new Capture(this, cameras[24]); //書き換え部分
// Or, the settings can be defined based on the text in the list
//cam = new Capture(this, 640, 480, "Built-in iSight", 30);
// Start capturing the images from the camera
cam.start();
}
}
void draw() {
if (cam.available() == true) {
cam.read();
}
image(cam, 0, 0, width, height);
// The following does the same as the above image() line, but
// is faster when just drawing the image without any additional
// resizing, transformations, or tint.
//set(0, 0, cam);
}
これを実行すると、外付けしたWebカメラを認識して映像が表示されるのではないでしょうか。
何かありましたらコメントいただけると幸いです。
#参考
https://dandashokai.com/7588
http://kovayashi.blog120.fc2.com/blog-entry-320.html