2012年11月7日水曜日

Processing で Webカメラが使えないとき

ProcessingでUSBにつないだWebカメラを使おうと思って、どっかからコードスニペットを拾ってきて、「動かねー!」ってなってるとき。
だいたい「Processing カメラ」とかで検索して「WinVDIGを入れろ」とか「バージョンは1.0.1にしろ」だとか「problem connecting video output to video renderer って出る」とか・・・
なんですけど、ちょっとストップ。
実はこれら、みんなProcessing 1.x系のtipsです。2.0からWebカメラの使い方が変わってるので、上のような情報はスルーしてください。
1.xだったら、Webカメラを使うときは

というように書いていましたが、
2.0からは

という風になります。

14 件のコメント:

  1. 参考になりました!ありがとうございます

    返信削除
  2. コメントありがとうございます!

    返信削除
  3. この問題に対してずっと悩んでました。
    参考になりました。有り難うございます!

    返信削除
  4. コメントありがとうございます!

    返信削除
  5. こんにちは。
    Processing2.1.2を使用しています。
    上記プログラムを入力してみましたが、グレーのWindowが出るのみ・・・

    何か対応策をご存知でしたら、教えてください。

    返信削除
    返信
    1. Frogさん、こんばんわ!
      コメントありがとうございます。

      Processing 2.1.2が既にDLできず、私の環境では再現できないのですが、まず上記コード10行目の
      capture.start();
      を忘れていないか、確認してみてもらえますか?

      次に、ウェブカメラのモードやデバイスが複数あって正しく選べていないかもしれないので、次のコードを動作させて、コンソールに何が出るか見せてもらえますか?
      import processing.video.*;
      Capture capture;
      void setup()
      {
      String[] cameras = Capture.list();
      for (int i = 0; i < cameras.length; i++) {
      println(cameras[i]);
      }
      }

      削除
    2. こんにちは。
      早速のご返答、ありがとうございます。
      まず、capture.start();の書き忘れはありませんでした。
      次にコードを実行した結果ですが、
       name=Lenovo EasyCamera,size=1280×720,fps=30
      と言った形で、sizeの違うものが合計12個ズラッと並んでいます。
      中にはfpsの違うものも2つあります。

      削除
    3. 確認ありがとうございます。
      Lenovoマシンのビルトインカメラですね。他のUSBカメラの接続はないですよね?

      カメラがデータを用意できているかの確認のため、draw()内に
      println(capture.available());
      を入れてみたら、どうなりますか?コンソールにtrueと出ることはありますか?

      また、setup()内で
      capture = new Capture(this, cameras[0]);
      の替わりに
      capture = new Capture(this, 1280, 720, "Lenovo EasyCamera", 30);
      等と記述したらどうでしょうか?

      削除
    4. おはようございます。
      ご推察のとおり、Lenoveマシンについているカメラを使用したいと思っています。

      draw()内にprintln(・・・を入れた結果ですが、
      falseでした(^^;

      setup()内のcapture = new Capture(・・・を変更した結果、
      変化はありませんでした。

      これは、そもそもカメラと通信ができていないということでしょうか?

      削除
    5. カメラそのものの存在は見つけられているようですが、カメラからフレームデータを取得できていないためtrueにならないんだと思います。

      Processing以外のカメラを使うアプリケーション(Skypeなど)では正常に映るでしょうか?

      また、もし他にUSB接続のウェブカメラがあれば、それでも試してみると切り分けの参考になります。

      削除
    6. パソコンに付属のソフト(今、名前がわかりませんが)では普通に写っています。
      他のUSB接続Webカメラは持っていません。
      これがうまくいったら、購入して広範囲の撮影をしたいと思ってはいるのですが。

      色々とありがとうございます。
      フレームデータを取得・・・別の命令などがあるのでしょうか??
      そのあたりをまた、調べてみます。

      何か解決策等あれば、また教えてください。

      削除
    7. 度々すみません(・・;
      GSVideoライブラリというものを見つけまして。
      ダウンロードしてmodes\java\librariesにコピーして、下記のプログラムを実行したところ、画像が表示されました。

      import codeanticode.gsvideo.*;
      int w_img = 640;
      int h_img = 480;
      int p_text_size = 30;
      int fps = 24;
      GSCapture cam;
      void setup() {
      size(w_img, h_img);
      String[] cameras = GSCapture.list();
      if (cameras.length == 0){
      println("There are no cameras available for capture.");
      exit();
      }
      else {
      println("Available cameras:");
      for (int i = 0; i < cameras.length; i++) {
      println(cameras[i]);
      }
      cam = new GSCapture(this, w_img, h_img, cameras[0]);
      cam.start();
      }
      }
      void draw() {
      frameRate(fps);
      if (cam.available()) {
      cam.read();
      image(cam, 0, 0);
      }
      }

      GSVideoライブラリはまだ中身をしっかり確認しておりませんが、
      この中の何かが、解決の糸口?だったようです。
      また勉強します。
      本当にお世話になりました!
      ありがとうございました!!

      削除
    8. 解決のご報告ありがとうございます!よかったですね。
      ウェブカメラとProcessingの間で、データフォーマットの対応などで相性が悪く、それをGSVideoのライブラリがカバーしたっていう感じでしょうか。

      削除
  6. このコメントは投稿者によって削除されました。

    返信削除