在上次博客的基础上,继续完成视频中移动对象的统计。
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
void main( )
{
VideoCapture capture;
capture.open("E:\\video.avi");
if (!capture.isOpened()) cout << "video not open.." << endl;
// 初始BS模型
//Ptr<BackgroundSubtractor> pMOG2 = createBackgroundSubtractorMOG2();//高斯混合
Ptr<BackgroundSubtractor> KNN = createBackgroundSubtractorKNN();//knn
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("frame", frame);
KNN->apply(frame, mogMask);
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 < 30| selection.height < 30) continue; // 车尺寸太小也忽略
count++;
rectangle(frame, selection, Scalar(0, 0, 255), 2, 8); // 绘制车的外接矩形
sprintf_s(numText, "%d", count);
putText(frame, numText, Point(selection.x, selection.y), CV_FONT_NORMAL, FONT_HERSHEY_PLAIN, Scalar(255, 0, 0), 1, 8);
}
imshow("mogMask", frame);
if (waitKey(50) == 27) break;
}
capture.release();
waitKey(0);
}
显示效果:
这里的效果是用KNN做的,也可以用高斯混合来做。。