気の向くままに辿るIT/ICT/IoT
webzoit.net
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せずに機能していたのは、不思議ではある...のでバージョンアップでバグが修正されたのかもしれない。

ウェブ造ホーム前へ次へ