1. ホーム
  2. OpenCV

opencv3.0とopencv2.4のガウス混合モデルbackgroundSubtractorMOG2の使い分けについて

2022-02-28 07:06:48


opencv3.0とopencv2.4におけるBackgroundSubtractorMOG2関数の実装の違いについて

opencv2.4 では、#include "opencv2/opencv.hpp" ヘッダーファイルさえ追加すれば、メイン呼び出しコードは次のようになります。

int main()
{
	VideoCapture video(". /video.avi");
	Mat frame, mask, thresholdImage, output;
	int frameNum = 1;
	if (!video.isOpened())
		cout << "fail to open!" << endl;
	//cout<<video.isOpened();
	long totalFrameNumber = video.get(CV_CAP_PROP_FRAME_COUNT);
	video>>frame;
	//cout<<frame.size;
	BackgroundSubtractorMOG bgSubtractor(20, 10, 0.5, false);
	//imshow("video", frame);
	//waitKey(10000);
	
	while (true){
		if (totalFrameNumber == frameNum)
			break;
		video >> frame;
		++frameNum;
		bgSubtractor(frame, mask, 0.001);
		//cout << frameNum << endl;
		imshow("mask",mask);  
		waitKey(10);  
	}
	
	return 0;
}

しかし、opencv 3.0 では、この関数の使い方が異なっており、また 3.0 では BackgroundSubtractorMOG 関数が少なく、BackgroundSubtractorMOG2 のみです。opencv 公式ドキュメント segment_objects.cpp ( http://http://docs.opencv.org/master/dd/d9d/segment_objects_8cpp-example.html#a22 ) を使って、その使い方を考えてみました。

私は以下のコードを使っています、vs2013+opencv3.0.0betaです。

#include "opencv2/opencv.hpp"
#include "opencv2/video/background_segm.hpp"

using namespace cv;
using namespace std;
int main()
{
	VideoCapture video(". /video.avi");
	int frameNum = 1;
	Mat frame, mask, thresholdImage, output;
	if (!video.isOpened())
		cout << "fail to open!" << endl;
	//cout<<video.isOpened();
	double totalFrameNumber = video.get(CAP_PROP_FRAME_COUNT);
	video >> frame;
	Ptr<BackgroundSubtractorMOG2> bgsubtractor = createBackgroundSubtractorMOG2();
	bgsubtractor->setVarThreshold(20);
	
	while (true){
		if (totalFrameNumber == frameNum)
			break;
		video >> frame;
		++frameNum;
		//bgSubtractor(frame, mask, 0.001);
		bgsubtractor-> apply(frame, mask, 0.01);
		imshow("mask", mask);
		waitKey(10);
	}
	
	return 0;
}

参考

https://blog.csdn.net/xiaowei_cqu/article/details/23689189#comments