三帧差法
目的:解决帧间差分法的“双影”问题。算法步骤如下:
(1) Det1=framePre-framePrePre;
(2) Det2=frameNow-framePre;
(3) frameDet=Det1&Det2;
(4)形态学处理(如dilate).
************************************************************************/
#include<opencv2/core/core.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>
#include <opencv2/video/video.hpp>
#include <iostream>
using namespace cv;
using namespace std;
cv::Mat frame;
cv::Mat result;
char image_name[25];
//三帧间差分
int main()
{
int i=0;
cv::Mat framePrePre, framePre, frameNow, frameDet;
cv::Mat contours, contoursInv;
cv::Mat Det1, Det2;
VideoCapture capture("Crowd-Activity-All.avi");
if (!capture.isOpened())
{
return 0;
}
double videoFPS = capture.get(CV_CAP_PROP_FPS); //获取帧率
double videoPause = 1000 / videoFPS;
std::cout << videoFPS << endl;
std::cout << videoPause << endl;
capture >> framePrePre;
capture >> framePre;
cvtColor(framePrePre, framePrePre, CV_RGB2GRAY);
cvtColor(framePre, framePre, CV_RGB2GRAY);
int save = 0;
bool stop(false);
while (!stop)
{
capture >> frameNow;
if (frameNow.empty() || waitKey(videoPause) == 27)
{
break;
}
cvtColor(frameNow, frameNow, CV_RGB2GRAY);
Mat Det1;
Mat Det2;
absdiff(framePrePre, framePre, Det1); //帧差1
absdiff(framePre, frameNow, Det2); //帧差2
threshold(Det1, Det1, 0, 255, CV_THRESH_OTSU); //自适应阈值化
threshold(Det2, Det2, 0, 255, CV_THRESH_OTSU);
bitwise_and(Det1, Det2, frameDet);
Mat element = getStructuringElement(0, Size(3, 3)); //膨胀核
dilate(frameDet, frameDet, element); //膨胀
dilate(frameDet, frameDet, element);
framePrePre = framePre;
framePre = frameNow;
imshow("Video", frameNow);
imshow("Detection", frameDet);
sprintf(image_name, ".\\three frames subtraction method_image\\%d.jpg", ++i);
imwrite(image_name, frameDet);
}
return 0;
}
测试通过!