opencv移动物体检测(自动更新背景)

#include "pch.h"
#include <iostream>
#include <opencv2\opencv.hpp>
#include <vector>

using namespace cv;
using namespace std;

int main()
{
	VideoCapture capture(0);//capture("D:\\项目资料\\车载AR\\夜视录屏\\20190103_200614.mp4");
	if (!capture.isOpened())//如果视频不能正常打开则返回
		return 0;

	Ptr<BackgroundSubtractor> pMOG2 = createBackgroundSubtractorMOG2();
	Mat kernel = getStructuringElement(MORPH_RECT,Size(3, 3), Point(-1, -1));

	vector<vector<Point>> contours;
	vector<Vec4i> hireachy;

	Mat frame, gray, mogMask;

	while (capture.read(frame))
	{
		imshow("src6-16", frame);
		pMOG2->apply(frame, mogMask, 0.8f);
		
		threshold(mogMask, mogMask, 100, 255, THRESH_BINARY);
		
		morphologyEx(mogMask, mogMask, MORPH_OPEN, kernel, Point(-1, -1));
		findContours(mogMask, contours, hireachy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE, Point(0, 0));
		cvtColor(mogMask, mogMask, COLOR_GRAY2BGR);
		
		int count = 0;
		char numText[8];
		for (size_t t = 0; t < contours.size(); t++)
		{
			double area = contourArea(contours[t]);
			if (area < 100)
				continue;

			Rect selection = boundingRect(contours[t]);
			if (selection.width < 10 || selection.height < 10)
				continue;
			count++;
			rectangle(mogMask, selection, Scalar(0, 0, 255), 2, 8);

			sprintf_s(numText, "%d", count);
			putText(mogMask, numText, Point(selection.x, selection.y), CV_FONT_NORMAL, FONT_HERSHEY_PLAIN, Scalar(255, 0, 0), 1, 8);
		}

		imshow("num6-16", mogMask);
		if (waitKey(50) == 27)
			break;

	}

	capture.release();//释放资源
	waitKey(0);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/zouxin_88/article/details/85774173