OpenCVで背景差分

※追記:OpenCV 3.4.1版の記事は下記リンク。使えるアルゴリズムが増えている。

whoopsidaisies.hatenablog.com


以降はOpenCV 2.4.7のサンプル。

背景差分

固定カメラで移動物体の検出をするのに有効な手法.OpenCV2.4.7では混合正規分布(Mixture of Gaussian Distribution, MoG)によるアルゴリズム,Godbehere,Matsukawa,Goldbergによるアルゴリズム(GMG)が用意されているので試してみる.

サンプルコード

BackgroundSubtractorMOGクラス,BackgroundSubtractorMOG2クラスおよびBackgroundSubtractorGMGクラスで背景差分の計算ができる.

アルゴリズムによってパラメータ等が違うが,基本的な計算は共通の書き方で使用できる.以下にサンプルコードを示す.

#include <opencv2/opencv.hpp>

void main()
{
	cv::VideoCapture cap = cv::VideoCapture("test.avi");

	// 背景差分計算用オブジェクトの生成
	cv::BackgroundSubtractorGMG backGroundSubtractor;
	//cv::BackgroundSubtractorMOG backGroundSubtractor;
	//cv::BackgroundSubtractorMOG2 backGroundSubtractor;

	while (cv::waitKey(1) == -1)
	{
		cv::Mat frame, foreGroundMask, output;

		// 画像取得
		cap >> frame;
		if (frame.empty())
			break;

		// マスク画像の取得
		backGroundSubtractor(frame, foreGroundMask);
	
		// 入力画像にマスク処理を行う
		cv::bitwise_and(frame, frame, output, foreGroundMask);

		cv::imshow("output", foreGroundMask);
	}
}