您的位置:首页 > 其它

简单帧差法

2016-07-16 11:11 176 查看
代码来自:http://www.cnblogs.com/tornadomeet/archive/2012/05/01/2477629.html

#include <string>
#include <iostream>
#include <stdio.h>
#include <fstream>
#include<math.h>

#include <opencv2\opencv.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <opencv2\core\core.hpp>

#define threshold_diff 18 //设置简单帧差法阈值

using namespace cv;
using namespace std;

int main(int argc, unsigned char* argv[])
{
Mat img_src1, img_src2, img_dst, gray1, gray2, gray_diff;
bool pause = false;

VideoCapture vido_file("a.avi");//在这里改相应的文件名
namedWindow("foreground", 0);
for (;;)
{
if (!pause )
{
vido_file >> img_src1;        //因为视频文件帧数已经固定了,所以每次到这句语句都是读取相邻的帧数,没到时间视频并不向前走
if (img_src1.empty())        //【】没有这个判断的话,视频播放完了会有内存溢出错误,所以播完就直接break!
break;
//GaussianBlur(img_src1, img_src1, Size(3, 3), 60);
cvtColor(img_src1, gray1, CV_BGR2GRAY);
imshow("video_src", img_src1);//可以事先不用新建一个窗口
waitKey(5);

vido_file >> img_src2;
//GaussianBlur(img_src2, img_src2, Size(3, 3), 60);
cvtColor(img_src2, gray2, CV_BGR2GRAY);
imshow("video_src", img_src2);//可以事先不用新建一个窗口

waitKey(5);
subtract(gray1, gray2, gray_diff);
GaussianBlur(gray_diff, gray_diff, Size(3, 3), 0,0);
for (int i = 0; i<gray_diff.rows; i++)
for (int j = 0; j<gray_diff.cols; j++)
if (abs(gray_diff.at<unsigned char>(i, j)) >= threshold_diff)//这里模板参数一定要用unsigned char,否则就一直报错
gray_diff.at<unsigned char>(i, j) = 255;
else gray_diff.at<unsigned char>(i, j) = 0;

imshow("foreground", gray_diff);
}
char c = (char)waitKey(10);
if (c == 27)
{
break;
}
if (c == ' ')
pause = !pause;
}
return 0;
}


效果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: