気の向くままに辿るIT/ICT/IoT
IoT・電子工作

ProcessingとWebカメラで動体検知・追跡デモ

ホーム前へ次へ
Arduinoって?

ProcessingとWebカメラで動体検知・追跡デモ

ProcessingとWebカメラで動体検知・追跡デモ

Processingでモーショントラッキング
2018/03/28

 Processingでモーショントラッキング(動体検知・動体追跡)のデモンストレーション。

 今回は、Processing Webカメラ/モーショントラッキングのスケッチを試させて頂きました。

 ただし、現行のProcessing 3に対し、スケッチで使用しているCapture::Settings()メソッドは、Processing 1.0/1.1あたりのもので今となっては、使われていない模様、ということで他含め、一部、修正させて頂きました。

 また、自身が使わせて頂いているLinux(Debian 9/Stretch)においてProcessing 3標準Videoライブラリがエラーとなり正常に機能せず、代わりに有志の方のテスト版Videoライブラリを使わせて頂くことでLinux+Processing 3でWebカメラの利用や動画再生ができるようになった経緯があります。

 ちなみにLinux界隈には、動体検知ソフトウェアパッケージとして、その名もmotionがあり、以前、USB Webカメラの検証時に使わせて頂いたことがあります。

 尚、このページのくくりとしては、ArduinoとProcessingの連携についてなのですが、Arduino側については、とりあえず、さておくものとします。

 今回、さておいてしまったArduinoの回路はなく、Processing 3をインストールしたPCとPC内臓カメラか、USB外付けWebカメラがあればよいでしょう。

...
 
/*
int w=320;
int h=240;
*/
int w=640;
int h=480;
 
...
 
void setup(){
// size(w, h);
 size(640, 480);
 
...
 
void keyPressed(){
 if(key=='c'){
//  video.settings();//カメラセッティング
  String[] cams = Capture.list();
  printArray(cams);
  /* カメラのキャプチャー */
  video = new Capture(this, cams[0]);
  video.start();
   if (video.available())
   {
      video.read();
   }
   /* 画像を表示 */
   set(0, 0, video);
 }
 if(key==CODED){
  if(keyCode==LEFT){
    tolerance-=1;//許容値を-1する
  }
  if(keyCode==RIGHT){
    tolerance+=1;//許容値を+1する
  }
 }
}

 スケッチについては、修正した部分のみ記載するものとし、あとはリンク先を参照。

 まず、Processing 3では、size()の引数は、変数ではなく、固定値にしないとエラーになるので固定値とし、デフォルトのサイズでは小さかったためサイズ変更。

 ただ、変数を許容する部分では、そのまま、[w]、[h]を使いました。

 あとは、void keyPressed(){}内の[video.settings()]部分をProcessing 3で機能するように書き換えました。

 と言っても、とりあえず、サンプルスケッチなどから切り貼りしただけで、もっとスマートな書き方があるのかもしれませんが、機能したので良しとします。

 内蔵カメラやUSBカメラなどWebカメラが複数ある場合には、printArray(Capture.list())でProcessing IDEの情報ウィンドウに列挙されるので所望のカメラの要素もわかります。

 ちなみに[LEFT]/[RIGHT]は、マウスの左クリック、右クリックなんでしょうが、[CODED]ってなんだろう...。

[2018/08/26]

 ふと、webcam_capture.pdeとwebcam_motion_tracking.pdeを改めて試してみたくなりました。

 なぜか、Processingを削除していたので改めてインストールしようと思ったら、新しいバージョンProcessing 3.4がリリースされていた為、展開済みの既存の3.3.6、3.3.7はさておき、3.4をダウンロード・展開、端末上で当該ディレクトリに移動し、./install.shしました。

 そこでパソコンにWebカメラをUSB接続し、先の2つのスケッチを実行してみると前者はあっさりProcessingのモニタが開き、映像が表示されましたが、後者では、モニタ上に2文字ほど文字化けした赤文字が表示されました。

 [デバッグ]メニューから[デバッグを有効化]し、デバグしてみると、なぜか、draw()関数の1行め(if (video.available()) {)の条件に入らない...if文を外すとCaptureが利用可能でないため当然、正常に機能しない...そこで前者のスケッチと見比べた結果、目ぼしをつけた次の行を追加したところ、エラーなく、正常に機能、動体検知できるようになった次第。

import processing.video.*;
Capture video;
...
void setup(){
// size(w, h);
 size(640, 480);
 video = new Capture(this, w, h);
...
 
 video.start();
}

 追加した行は、setup()関数の最後のvideo.start();。

 尚、今回は試していませんが、以前のバージョンProcessing 3.3.6、3.3.7では、この行がない状態で機能していました。

 今回は何れのスケッチもコピペしたので、これら2つのスケッチの編集はしておらず、検証後、タイムスタンプを確認してみると当ページ新規作成時と同じなので間違いないはず。

 とは言え、こうしてみると、当時、Captureをstartせずに機能していたのは、不思議ではある...のでバージョンアップでバグが修正されたのかもしれません。

ホーム前へ次へ