案例需求
统计视频中行人个数
实现方法
采用BSM算法提取运动物体前景,通过形态学方法处理降噪,采用轮廓过滤基数
代码
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace std;
using namespace cv;
int main(void)
{
Mat frame,dst;
Mat bsmaskMOG2;
int count;
VideoCapture cap;
namedWindow("input video",WINDOW_AUTOSIZE);
//创建BSM消除器 基于GMM
Ptr<BackgroundSubtractorMOG2> pMOG2 = createBackgroundSubtractorMOG2();
if(!cap.open("/work/opencv_video/vtest.avi"))
{
cout << "video is err" << endl;
return -1;
}
//开操作 掩膜
Mat kernel = getStructuringElement(MORPH_RECT,Size(5,5));
while(true)
{
cap>>frame;
if(frame.empty())
{
break;
}
imshow("input video",frame);
dst = frame.clone();
//识别前景
pMOG2->apply(frame,bsmaskMOG2);
//开操作 消除噪点
morphologyEx(bsmaskMOG2,bsmaskMOG2,MORPH_OPEN,kernel);
vector<vector<Point>> contours;
findContours(bsmaskMOG2,contours,RETR_TREE,CHAIN_APPROX_SIMPLE);
count = 0;
char num_text[8];
for(size_t i=0;i<contours.size();i++)
{
double area = contourArea(contours[i]);
if(area<400)
continue;
Rect rect = boundingRect(contours[i]);
if(rect.width<20 || rect.height<20)
continue;
count++;
sprintf(num_text,"%d",count);
rectangle(dst,rect,Scalar(0,0,255),2,8,0);
putText(dst,num_text,Point(rect.x,rect.y),FONT_HERSHEY_SIMPLEX,FONT_HERSHEY_PLAIN,Scalar(255,0,0),2,8);
}
//显示结果
imshow("count",dst);
if(waitKey(100)>0)
break;
}
cap.release();
destroyAllWindows();
return 0;
}