#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
//针处理函数
void processFrame(Mat& binary, vector<Rect>& rect);
int main(int argc, char**) {
VideoCapture capture;
capture.open("video_003.avi");
if (!capture.isOpened()) {
printf("could not find the video file...\n");
return -1;
}
int frame_count = capture.get(CAP_PROP_FRAME_COUNT);
int fps = capture.get(CAP_PROP_FPS);
cout << frame_count << endl;
cout << fps << endl;
// create windows
Mat frame;
Mat bsmaskMOG2, bsmaskKNN;
namedWindow("input video", WINDOW_AUTOSIZE);
namedWindow("MOG2", WINDOW_AUTOSIZE);
namedWindow("KNN Model", WINDOW_AUTOSIZE);
Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
Mat kernel2 = getStructuringElement(MORPH_ELLIPSE, Size(3, 3), Point(-1, -1));
// intialization BS
Ptr<BackgroundSubtractor> pMOG2 = createBackgroundSubtractorMOG2();
/*
Ptr<backgroundsubtractormog2>
cv::createBackgroundSubtractorMOG2 (
int history = 500, //用于训练背景的帧数,默认为500帧,如果不手动设置learningRate
,history就被用于计算当前的learningRate,此时history越大,learningRate越小,背景更新越慢;
double varThreshold = 16, //方差阈值,用于判断当前像素是前景还是背景。一般默认16
,如果光照变化明显,如阳光下的水面,建议设为25,36,具体去试一下也不是很麻烦,值越大,灵敏度越低;
bool detectShadows = true //是否检测影子,设为true为检测,false为不检测,
检测影子会增加程序时间复杂度,如无特殊要求,建议设为false;
)
*/
Ptr<BackgroundSubtractor> pKNN = createBackgroundSubtractorKNN();
while (capture.read(frame)) {
vector<Rect> rect;
// MOG BS
pMOG2->apply(frame, bsmaskMOG2);
/*
virtual void cv::BackgroundSubtractor::apply (
InputArray image, //image 源图
OutputArray fgmask, //fmask 前景(二值图像)
double learningRate = -1 //learningRate 学习速率,
,值为0-1,为0时背景不更新,为1时逐帧更新,默认为-1,即算法自动更新
)
*/
morphologyEx(bsmaskMOG2, bsmaskMOG2, MORPH_OPEN, kernel, Point(-1, -1));
//dilate(bsmaskMOG2, bsmaskMOG2, kernel2, Point(-1, -1), 2);// 膨胀
imshow("MOG2", bsmaskMOG2);
// KNN BS mask
// 最后一个参数 (0-1之间表示学习背景模型时长,-1表示opencv自动设置学习时长
//,0表示不更改背景模型,1表示背景模型按照最后一帧重新初始化)
pKNN->apply(frame, bsmaskKNN, -1);
imshow("KNN Model", bsmaskKNN);
morphologyEx(bsmaskKNN, bsmaskKNN, MORPH_OPEN, kernel2, Point(-1, -1));
dilate(bsmaskKNN, bsmaskKNN, kernel2, Point(-1, -1), 4);// 膨胀
//处理bsmaskKNN二值化图像
processFrame(bsmaskMOG2, rect);
for (int j = 0; j < rect.size(); j++)
{
rectangle(frame, rect[j], Scalar(0, 0, 255), 2, 8);
}
imshow("input video", frame);
char c = waitKey(100);
if (c == 27) {
break;
}
}
capture.release();
waitKey(0);
return 0;
}
void processFrame(Mat& binary, vector<Rect>& rect) {
vector<vector<Point>> contours;
vector<Vec4i> hireachy;
findContours(binary, contours, hireachy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE, Point(0, 0));
int num = contours.size();
for (int i = 0; i < num; i++)
{
int num_points = contours[i].size();
if (num_points > 20)
{
Rect point_rect = boundingRect(contours[i]);
rect.push_back(point_rect);
}
}
}
数字图像处理项目:背景建模跟踪目标(提取轮廓显示矩形框)
最新推荐文章于 2020-08-16 21:36:41 发布