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

Processing/OpenCVとWebカメラで動体検知・追跡

ホーム前へ次へ
Arduinoって?

Processing/OpenCVとWebカメラで動体検知・追跡

Processing/OpenCVとWebカメラで動体検知・追跡

ProcessingのOpenCVライブラリでモーショントラッキング
2018/10/02

 Processing 3のOpenCVライブラリとUSB接続Webカメラでリアルタイムのモーショントラッキング(動体検知・動体追跡)をしてみるページ。

 以前、後述のVideoライブラリのみによる動体検知を試してみましたが、今回は、そのOpenCVライブラリ版。

 ちなみに以前、Linux界隈で有名らしき動体検知ソフトウェアmotionを使ってみたこともあります。

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

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

Processing用OpenCVライブラリの追加

 Processing IDEの[スケッチ] => [ライブラリをインポート...] => [ライブラリを追加...]メニューを選択、[Libraries]タブから[OpenCV for Processing]を選び、[Install]します。

代替Videoライブラリをダウンロード・配置

 LinuxなどUNIXライクなOSに限ってのことのようですが、相変わらず、Processing 3標準Videoライブラリがエラーとなり正常に機能しないため、代わりに有志の方のテスト版Videoライブラリを使わせて頂いた

スケッチ

import gab.opencv.*;
import processing.video.*;
 
//Movie video;
Capture video;
OpenCV opencv;
 
void setup() {
 size(720, 480);
// video = new Movie(this, "street.mov");
 String[] cams = Capture.list();
 printArray(cams);
 /* カメラのキャプチャー */
 video = new Capture(this, cams[0]);
 
 opencv = new OpenCV(this, video);
 
 opencv.startBackgroundSubtraction(5, 3, 0.5);
 
// video.loop();
// video.play();
 video.start();
}
 
void draw() {
 if(video.available()){
  background(0);
  video.read();
//  set(0,0,video);//カメラ映像表示
//  loadPixels();//画面内ピクセルをロードしておく
 
  image(video, 0, 0); 
  opencv.loadImage(video);
  
  opencv.updateBackground();
  
  opencv.dilate();
  opencv.erode();
 
  noFill();
//  stroke(255, 0, 0);
  stroke(255, 255, 0);
  strokeWeight(3);
  for (Contour contour : opencv.findContours()) {
   contour.draw();
  }
 }
}
 
void movieEvent(Movie m) {
 m.read();
}

 予め保存してある動画ファイルを使って動体検知を行なうOpenCVライブラリのサンプルスケッチBackgroundSubtractionをベースにCaptureと前回Processing Webカメラ/モーショントラッキングデモのソースを見比べながら、手探りでやってみた結果、こうなりました。

 今回は、動体にボールペン(白いボディに黒いグリップ)のペン先(冒頭写真中央)を使ってみました。

スケッチをちょっと間違えたProcessingのOpenCVライブラリでモーショントラッキング

 ちなみに当初、opencv = new OpenCV(this, video);とすべきところをopencv = new OpenCV(this, 720, 480);としたら、こんなことに...。

 具体的には、動きを止めれば、物体形状の検知枠?は消えるし、追跡・追尾もできている一方、冒頭画像のように、なぜか、動体を検知した際、左右に振っているわけでもないのに物体を型どった検知枠が左右に複数、残像のように横いっぱいに表示されてしまったという...。

 こんなことになるのは...for文のContourのところかな?と思いつつ、追加でProcessing/OpenCVサンプルスケッチFindContoursと見比べてみて気づいた...。

 尚、スケッチから起動後、画面上に何も表示されず、カメラの認識、電源が入るまで若干時間がかかり、その後、ようやく映像が表示されるのは、多少の差こそあれ、これまでのスケッチでも同様。

ホーム前へ次へ