移動する物体を追跡する

  1. 移動する物体を追跡する
  2. findContours関数で輪郭を検出する
  3. 面積・重心の計算と動画書き出し
  4. 輪郭線を描画する

動画からダンゴムシの動きをトラッキングしています。このチュートリアルを実施すれば、他の多くの問題に対しても自身で解決できる能力を身につけられるでしょう。画像の2値化から輪郭検出、動画の書き出しまで広い内容を含んでいます。

手元に良い感じのサンプル動画がなかったため、庭先でダンゴムシを撮影してきました。今回はこの動画を解析します。動画は何でも良いのですが、背景が均一で追跡した物体とのコントラストの差ができるだけ大きいようにするのが良いでしょう。今回の動画は背景とのコントラストの差が小さくダンゴムシ追跡の難易度は少し高めです。



最終的な目的はダンゴムシの追跡ですが、まずは動画を再生して表示するだけのプログラムを作成します。動画へのパスは各々で動画の置いてある場所に合わせてください。

#include "opencv/cv.h"
#include "opencv/highgui.h"
using namespace cv;

int main(){
    Mat img;
    VideoCapture cap("pillbug.mp4");
    int max_frame=cap.get(CV_CAP_PROP_FRAME_COUNT);
    for(int i=0; i<max_frame;i++){ cap>>img;
        imshow("Video",img);
        waitKey(1);
    }
    return 0;
}

ダンゴムシが地面より黒いことを利用する

適当な閾値を設定し、動画の各フレームを2値化してみましょう。私がやってみたところ、この動画では閾値は固定70くらいがちょうど良さそうでした。当然ですが、この値は動画によって異なります。最後に、表示されたウィンドウのスクリーンショットを載せています。ダンゴムシのいる部分は黒く、他の部分は白くなっていますが、右下の部分で若干のノイズがみられ黒くなっている部分が見えます。したがって、今の時点で黒い部分をダンゴムシであるとは言えませんが、大きくかたまった黒い領域はダンゴムシのいる部分だけですので検出することができそうです。
3

#include "opencv/cv.h"
#include "opencv/highgui.h"
using namespace cv;

int main(){
    Mat img;
    Mat gray_img; //追加
    Mat bin_img; //追加
    VideoCapture cap("pillbug.mp4");
    int max_frame=cap.get(CV_CAP_PROP_FRAME_COUNT);
    for(int i=0; i<max_frame;i++){ cap>>img;
        cvtColor(img, gray_img, CV_BGR2GRAY);  //追加 グレースケールに変換
        threshold(gray_img,bin_img,70,255,THRESH_BINARY);  //追加 閾値80で2値画像に変換
        imshow("Video",bin_img); //変更
        waitKey(1);
    }
    return 0;
}
1 2 3 4 5