混合高斯运动检测笔记

来源:互联网 发布:海澜之家淘宝店好 编辑:程序博客网 时间:2024/04/30 20:18

参考了网上的博客,整理后实验如下:

#include <opencv2\opencv.hpp>

#include <iostream>
#include <string>


#include "opencv2/video/background_segm.hpp"
#include "opencv2/legacy/blobtrack.hpp"
#include "opencv2/legacy/legacy.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <opencv2/imgproc/imgproc_c.h>


#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>


#include <stdio.h>


using namespace cv;
using namespace std;
int main()
{
VideoCapture capture("D:/2.avi");
if (!capture.isOpened())
{
cout << "读取视频失败" << endl;
return -1;
}
//获取整个帧数
long totalFrameNumber = capture.get(CV_CAP_PROP_FRAME_COUNT);
cout << "整个视频共" << totalFrameNumber << "帧" << endl;


//设置开始帧()
long frameToStart = 20;
capture.set(CV_CAP_PROP_POS_FRAMES, frameToStart);
cout << "从第" << frameToStart << "帧开始读" << endl;


//设置结束帧
int frameToStop = 700;


if (frameToStop < frameToStart)
{
cout << "结束帧小于开始帧,程序错误,即将退出!" << endl;
return -1;
}
else
{
cout << "结束帧为:第" << frameToStop << "帧" << endl;
}


double rate = capture.get(CV_CAP_PROP_FPS);
int delay = 1000 / rate;


cv::BackgroundSubtractorMOG2 mog(20,16,true);
cv::Mat foreground; 
cv::Mat background; 
cv::Mat frame; 
cv::Mat frameB;
bool stop(false);
//currentFrame是在循环体中控制读取到指定的帧后循环结束的变量
long currentFrame = frameToStart;
while (!stop)
{
if (!capture.read(frame))
{
cout << "从视频中读取图像失败或者读完整个视频" << endl;
return -2;
}
//GaussianBlur(frame,frameB,Size(5,5),0,0);
bilateralFilter(frame, frameB, 5, 20.0, 20.0);
imshow("输入视频", frameB);
//参数为:输入图像、输出图像、学习速率
mog(frameB, foreground, 0.01);
cout << currentFrame << endl;
// 腐蚀 
cv::erode(foreground, foreground, cv::Mat());
cv::erode(foreground, foreground, cv::Mat());
// 膨胀 
cv::dilate(foreground, foreground, cv::Mat());
cv::dilate(foreground, foreground, cv::Mat());
/*
// 腐蚀 
cv::erode(foreground, foreground, cv::Mat()); 
// 膨胀 
cv::dilate(foreground, foreground, cv::Mat()); 
cv::dilate(foreground, foreground, cv::Mat());
*/
mog.getBackgroundImage(background); 
// 返回当前背景图像 
cv::imshow("foreground", foreground); 
cv::imshow("background", background); 
if (currentFrame == 150)
{
imwrite("frameB150.jpg", frameB);
imwrite("foreground150.jpg", foreground);
}
if (currentFrame == 300)
{
imwrite("frameB300.jpg", frameB);
imwrite("foreground300.jpg", foreground);
}
if (currentFrame == 450)
{
imwrite("frameB450.jpg", frameB);
imwrite("foreground450.jpg", foreground);
}
//按ESC键退出,按其他键会停止在当前帧


int c = waitKey(delay);


if ((char)c == 27 || currentFrame >= frameToStop)
{
stop = true;
}
if (c >= 0)
{
waitKey(0);
}
currentFrame++;


}


waitKey(0);

}

0 0