2013年07月19日

Webcam Capture を使って Java から Webカメラ を簡単制御(キャプチャ・動体検知)する

PCにバンドルされていながら使う頻度が低い・割高なデバイスといえば Webカメラ(独自算出)。 でも、プログラムから自由に使えるとなればその評価も変わってきます。 今日は Java でWebカメラを簡単に操作できる Webcam Capture / Java Webcam API をご紹介しますよ。

webcam capture java library


Webcam Capture のダウンロードと設定


Webcam Capture のプロジェクト・ページはこちら。 ページ上部にあるzipボタンでファイルをダウンロードしましょう。

Webcam Capture in Java

現時点で動作確認済み環境は以下の通り。

  • Windows XP 32-bit
  • Windows Vista 32-bit
  • Windows 7 64-bit
  • Ubuntu 12.04 64-bit
  • Mac OS Snow Leopard
  • Raspberry Pi @ Arch Linux

ダウンロードしたらzipファイルに含まれる webcam-capture-x.x.x.jar、bridj-*.jar、slf4j-api-x.x.x.jar をクラスパスに追加すれば準備はおしまいです。

webcam capture java classpath


Webcam Capture を使った Java アプリケーションからのWebカメラ制御・撮影


早速、Webカメラを使って撮影、画像ファイルを出力してみます。次に示すのは最も基本的なコード。

  public void takePicture() throws IOException {
    Webcam webcam = null;
    webcam = Webcam.getDefault();
    if (webcam != null) {
      System.out.println("Webcam : " + webcam.getName());
      webcam.open();
      BufferedImage image = webcam.getImage();
      ImageIO.write(image, "PNG", new File("pictures/webcam-capture.png"));
    } else {
      System.out.println("Failed: Webcam Not Found Error");
    }
  }


Webcam.getDefault() で Webcam インスタンスを取得出来れば、Webカメラをオープンしてイメージを撮影・ファイルに出力しています。

このコードを実行するとpicturesフォルダに指定した名前で png ファイルが作成されるはずです(サイズは176x144)。

webcam capture


ちなみに僕の DELL XPS 13 / Ubuntu 環境では webcam.getName() の値は次のようになりました。
 
Webcam : Laptop_Integrated_Webcam_1.3M /dev/video0


もし、複数のカメラ・デバイスが接続している場合には次のようにして目当ての Webcam インスタンスを取得します。

    int CAM_FRONT = 0;
    int CAM_USB1 = 1;
    List<Webcam> webcams = Webcam.getWebcams();
    webcam = webcams.get(CAM_FRONT);


え、画像サイズをもっと大きくしたい? 画像サイズの指定は次の通り。

  public void takePictureBySize(int width, int height) throws IOException {
    Webcam webcam = Webcam.getDefault();
    webcam.setViewSize(new Dimension(width, height));
    webcam.open();
    File pict = new File("pictures/webcam_" + width + "x" + height + ".png");
    ImageIO.write(webcam.getImage(), "PNG", pict);
    webcam.close();
  }


僕の XPS 13 で指定可能な最大サイズは 640x480 。 無事大きなサイズで出力出来ました。

webcam capture 640x480


IPネットワークで通信・制御可能なカメラ(IP CAM)も専用ドライバーを追加、指定すれば利用可能です。
詳しくは GitHub ページ(Capture Drivers)をどうぞ。

webcam capture additional capture drivers

クライアントからのリクエストに応じて撮影、画像データをレスポンスする独自サーバー・アプリケーションを作って使わなくなったネットブック上で動かしても面白いですね。


Webcam Capture とWebカメラを利用した動体検知 Java アプリケーション


Webカメラで監視して不審な動く物体があればメールで通知したい。 そんな時にも Webcam Capture API を利用すれば簡単に作れます。

まずは、リスナー・インタフェース(WebcamMotionListener)を実装したクラスを用意しましょう

public class MyMotionListener implements WebcamMotionListener {

  private SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd_HHmm_ss");
  private int threshold_strength = 1000;
  
  @Override
  public void motionDetected(WebcamMotionEvent event) {
    Date date = new Date(); 
    System.out.println(date.toString() + ": Cam detected motion! " + event.getStrength());
    if (event.getStrength() > threshold_strength) {
      System.out.println("Saving motion to image ...");
      BufferedImage image = Webcam.getDefault().getImage();
      try {
        ImageIO.write(image, "PNG", new File("pictures/motion_" + sdf.format(date) + ".png"));
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }

}


Webカメラで撮影している画像に変化が生まれると motionDetected が呼び出されます。 また、その際に受け取る WebcamMotionEvent オブジェクトからはその変化の大きさを getStrength() メソッドで取り出せるので、ここでは 1000 以上の大きさがあった場合のみ日付、時刻をファイル名に含めて画像ファイルとして出力しています。

さあ、準備が出来ました。 このリスナーを次のように WebcamMotionDetector オブジェクトに登録、start() すれば動体検知アプリケーションが動き出しますよ。

  public void motion() throws IOException {
    Webcam webcam = Webcam.getDefault();
    WebcamMotionDetector detector = new WebcamMotionDetector(webcam);
    detector.setInterval(100);
    detector.addMotionListener(new MyMotionListener());
    detector.start();
    
    System.out.println("Press Ctrl+C to stop.");
    System.in.read();
  }


ちなみに detector.setInterval(int millis) で指定しているのは撮影間隔。 ここでは付属するサンプル・コードと同じく100ミリ秒、10 FPS に設定しています。

Webカメラの前で物体を動かしてみると次のようなログが出力され、1000以上の変化強度であった場合には画像ファイルとして出力・保存されるはずです。

Fri Jul 19 20:16:24 JST 2013: Cam detected motion! 1385
Saving motion to image ...
Fri Jul 19 20:16:25 JST 2013: Cam detected motion! 840
Fri Jul 19 20:16:25 JST 2013: Cam detected motion! 31


画像を見ると・・・あー犯人が写っているー!、となる訳です。

webcam capture motion sample


Raspberry Pi でも動きますから少しの Java プログラミング知識と工夫で1万円を切る自作監視カメラが作れちゃいますね。

趣味・勉強・実益を兼ねて一度チャレンジするのも楽しいかもしれません。

それでは、より良い Java Webカメラ・ライフを!


Raspberry Pi Type B 512MB
Raspberry Pi Type B 512MB
posted with amazlet at 13.07.19
RS Components Ltd
売り上げランキング: 190

マイクロソフト フルHD Webカメラ LifeCam Studio Q2F-00020
マイクロソフト (2012-11-02)
売り上げランキング: 3,020

Posted by netbuffalo at 20:54│Comments(0)TrackBack(0) Java | プログラミング


この記事へのトラックバックURL

コメントする

名前
 
  絵文字