opencv之对象跟踪(背景消除建模BSM)

注:此教程是对贾志刚老师的opencv课程学习的一个记录,在此表示对贾老师的感谢.

下面代码实现了视频中背景消除和提取的建模,涉及到KNN(K近邻算法)和GMM(高斯混合模型)。

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

using namespace cv;
using namespace std;

int main(int argc, char**) {
    
    
	VideoCapture capture;
	capture.open("/home/fuhong/code/cpp/opencv_learning/src/object_tracing/video/video_003.avi");
	if (!capture.isOpened()) {
    
    
		printf("could not find the video file...\n");
		return -1;
	}
	// create windows
	Mat frame;
	Mat bsmaskMOG2, bsmaskKNN;
	namedWindow("input video", CV_WINDOW_NORMAL);
	namedWindow("MOG2", CV_WINDOW_NORMAL);
	//namedWindow("KNN Model", CV_WINDOW_AUTOSIZE);

	Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));

	// intialization BS
	Ptr<BackgroundSubtractor> pMOG2 = createBackgroundSubtractorMOG2();
	//Ptr<BackgroundSubtractor> pKNN = createBackgroundSubtractorKNN();
	while (capture.read(frame)) {
    
    
		imshow("input video", frame);

		// MOG BS
		pMOG2->apply(frame, bsmaskMOG2);
		morphologyEx(bsmaskMOG2, bsmaskMOG2, MORPH_OPEN, kernel, Point(-1, -1));    // 形态学开操作,去除小的白色小洞
		imshow("MOG2", bsmaskMOG2);

		// KNN BS mask
		//pKNN->apply(frame, bsmaskKNN);
		//imshow("KNN Model", bsmaskKNN);
		char c = waitKey(100);
		if (c == 27) {
    
    
			break;
		}
	}

	capture.release();
	waitKey(0);
	return 0;
}

效果如下:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/hongge_smile/article/details/108839508
今日推荐