代码来自:http://www.cnblogs.com/tornadomeet/archive/2012/05/01/2477629.html
1 #include <string> 2 #include <iostream> 3 #include <stdio.h> 4 #include <fstream> 5 #include<math.h> 6 7 #include <opencv2opencv.hpp> 8 #include <opencv2highguihighgui.hpp> 9 #include <opencv2imgprocimgproc.hpp> 10 #include <opencv2corecore.hpp> 11 12 13 #define threshold_diff 18 //设置简单帧差法阈值 14 15 using namespace cv; 16 using namespace std; 17 18 int main(int argc, unsigned char* argv[]) 19 { 20 Mat img_src1, img_src2, img_dst, gray1, gray2, gray_diff; 21 bool pause = false; 22 23 VideoCapture vido_file("a.avi");//在这里改相应的文件名 24 namedWindow("foreground", 0); 25 for (;;) 26 { 27 if (!pause ) 28 { 29 vido_file >> img_src1; //因为视频文件帧数已经固定了,所以每次到这句语句都是读取相邻的帧数,没到时间视频并不向前走 30 if (img_src1.empty()) //【】没有这个判断的话,视频播放完了会有内存溢出错误,所以播完就直接break! 31 break; 32 //GaussianBlur(img_src1, img_src1, Size(3, 3), 60); 33 cvtColor(img_src1, gray1, CV_BGR2GRAY); 34 imshow("video_src", img_src1);//可以事先不用新建一个窗口 35 waitKey(5); 36 37 vido_file >> img_src2; 38 //GaussianBlur(img_src2, img_src2, Size(3, 3), 60); 39 cvtColor(img_src2, gray2, CV_BGR2GRAY); 40 imshow("video_src", img_src2);//可以事先不用新建一个窗口 41 42 waitKey(5); 43 subtract(gray1, gray2, gray_diff); 44 GaussianBlur(gray_diff, gray_diff, Size(3, 3), 0,0); 45 for (int i = 0; i<gray_diff.rows; i++) 46 for (int j = 0; j<gray_diff.cols; j++) 47 if (abs(gray_diff.at<unsigned char>(i, j)) >= threshold_diff)//这里模板参数一定要用unsigned char,否则就一直报错 48 gray_diff.at<unsigned char>(i, j) = 255; 49 else gray_diff.at<unsigned char>(i, j) = 0; 50 51 imshow("foreground", gray_diff); 52 } 53 char c = (char)waitKey(10); 54 if (c == 27) 55 { 56 break; 57 } 58 if (c == ' ') 59 pause = !pause; 60 } 61 return 0; 62 }
效果: