#include<opencv2/opencv.hpp>
#include<iostream>
#include<string>
#include<vector>
using namespace std;
using namespace cv;
int main()
{
VideoCapture videoCap("WZYHCUT.mp4");//你要调用的文件,记得用转义符
if (!videoCap.isOpened())
{
cout<<"读取失败"<<endl;
return -1;
}
double videoFPS = videoCap.get(CAP_PROP_FPS); //获取帧率
double videoPause = 1000 / videoFPS;//每帧图像播放间隔
Mat framePre; //上一帧
Mat frameNext; //下一帧
Mat frameNow; //当前帧
Mat frameDet; //运动目标帧
Mat Det1;//帧差
Mat Det2;
videoCap >> framePre;
videoCap >> frameNow;
int num = 0;
while (true) {
namedWindow("Video", WINDOW_FREERATIO);
imshow("Video", frameNow);
videoCap >> frameNext;
if (frameNext.empty() || waitKey(videoPause) == 27)
{
break;
}
if (num == 0) {
cvtColor(framePre, framePre, COLOR_RGB2GRAY);//灰度化
cvtColor(frameNow, frameNow, COLOR_RGB2GRAY);
num++;
}
cvtColor(frameNext, frameNext, COLOR_RGB2GRAY);
absdiff(framePre, frameNow, Det1); //帧差1
absdiff(frameNow, frameNext, Det2); //帧差2
threshold(Det1, Det1, 0, 255, THRESH_OTSU); //自适应阈值化
threshold(Det2, Det2, 0, 255, THRESH_OTSU);
Mat element = getStructuringElement(0, Size(3, 3)); //膨胀核
dilate(Det1, Det1, element); //膨胀
dilate(Det2, Det2, element);
bitwise_and(Det1, Det2, frameDet);//与操作
namedWindow("运动目标", WINDOW_FREERATIO);
imshow("运动目标", frameDet);
framePre = frameNow;
frameNow = frameNext;
waitKey(videoPause);
}
videoCap.release();
return 0;
}