三帧差法是在相邻帧差法基础上改进的算法,在一定程度上优化了运动物体双边,粗轮廓的现象,相比之下,三帧差法比相邻帧差法更适用于物体移动速度较快的情况,比如道路上车辆的智能监控。
三帧差法基本实现步骤:
1. 前两帧图像做灰度差
2. 当前帧图像与前一帧图像做灰度差
3. 1和2的结果图像按位做“与”操作
#include "core/core.hpp"
#include "highgui/highgui.hpp"
#include "imgproc/imgproc.hpp"
using namespace cv;
int main()
{
VideoCapture videoCap;
videoCap.open(0);
if (!videoCap.isOpened())
{
return -1;
}
Mat framePrePre; //上上一帧
Mat framePre; //上一帧
Mat frameNow; //当前帧
Mat frameDet; //运动物体
videoCap >> framePrePre;
videoCap >> framePre;
cvtColor(framePrePre, framePrePre, CV_RGB2GRAY);
cvtColor(framePre, framePre, CV_RGB2GRAY);
int save = 0;
while (true)
{
videoCap >> frameNow;
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);
Mat element = getStructuringElement(0, Size(3, 3)); //膨胀核
dilate(Det1, Det1, element); //膨胀
dilate(Det2, Det2, element);
bitwise_and(Det1, Det2, frameDet);
framePrePre = framePre;
framePre = frameNow;
imshow("Video", frameNow);
imshow("Detection", frameDet);
if (cvWaitKey(27) == 27)
break;
}
return 0;
}