opencv--背景建模(BSM)

常見算法:1、圖像分割(GMM - 高斯混合模型),2、機器學習(KNN - K個最近鄰)

場景:主要運用在背景不變的場景下

代碼:

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
	VideoCapture capture;
	capture.open("./video/video_003.avi");
	//VideoCapture capture(0);
	if(!capture.isOpened())
	{
		printf("[%s][%d]could not load video data...\n",__FUNCTION__,__LINE__);
		return -1;
	}
	capture.set(CAP_PROP_FRAME_WIDTH, 320);
	capture.set(CAP_PROP_FRAME_HEIGHT ,240);
	double fps = capture.get(CAP_PROP_FPS);
	printf("[%s][%d]fps = %f\n",__FUNCTION__,__LINE__,fps);
	Size size = Size(capture.get(CAP_PROP_FRAME_WIDTH),capture.get(CAP_PROP_FRAME_HEIGHT));
  	cout << size << endl;
	Mat frame;

	Mat bsmaskMOG2;
	Ptr<BackgroundSubtractor> pMOG2 = createBackgroundSubtractorMOG2();

	Mat bsmaskKNN;
	Ptr<BackgroundSubtractor> pKNN = createBackgroundSubtractorKNN();
	
	Mat kernel = getStructuringElement(MORPH_RECT,Size(3,3),Point(-1,-1));

	while(capture.read(frame))
	{
		imshow("video-demo",frame);
		moveWindow("video-demo",0,0);

		pMOG2->apply(frame,bsmaskMOG2);
		morphologyEx(bsmaskMOG2,bsmaskMOG2,MORPH_OPEN,kernel,Point(-1,-1));
		imshow("MOG2",bsmaskMOG2);
		moveWindow("MOG2",size.width+70,0);

		pKNN->apply(frame,bsmaskKNN);
		morphologyEx(bsmaskKNN,bsmaskKNN,MORPH_OPEN,kernel,Point(-1,-1));
		imshow("KNN",bsmaskKNN);
		moveWindow("KNN",size.width*2+70,0);

		if(waitKey(33) == 27)
		{
			break;
		}
	}
	capture.release();
	waitKey(0);
	return 0;
}

效果:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章