在之前的《OpenCV4学习笔记(33)——KLT稀疏光流跟踪算法》和《OpenCV4学习笔记(34)——Farneback稠密光流算法》这两篇博文中,整理记录了基于稀疏光流跟踪和稠密光流跟踪算法实现的运动检测,而今天要记录的是另外一种实现运动检测的方法,那就是基于帧差法的运动检测。
帧差法,也叫做帧间差分法,这里引用百度百科上的一段定义:
帧间差分法是一种通过对视频图像序列中相邻两帧作差分运算来获得运动目标轮廓的方法,它可以很好地适用于存在多个运动目标和摄像机移动的情况。当监控场景中出现异常物体运动时,帧与帧之间会出现较为明显的差别,两帧相减,得到两帧图像亮度差的绝对值,判断它是否大于阈值来分析视频或图像序列的运动特性,确定图像序列中有无物体运动。图像序列逐帧的差分,相当于对图像序列进行了时域下的高通滤波。
最简单的帧差法就是二帧差分法,将视频流中的前后两帧图像转换为灰度图像,再经过高斯模糊消除噪声干扰,然后将两帧图像进行相减操作得到两帧图像之间的差异区域,再对差异图像进行二值分割把差异区域作为前景、不变区域作为背景,并且进行开运算操作来消除一些微小干扰。这样,就得到了两帧图像中明显不同的区域,也就是运动的目标物体。
下面看一下演示代码:
VideoCapture capture;
capture.open("D:\\opencv_c++\\opencv_tutorial\\data\\images\\bike.avi");
//capture.open("D:\\OpenCV\\opencv\\sources\\samples\\data\\vtest.avi");
if (!capture.isOpened())
{
return 0;
}
//两帧差法
Mat pre_frame, current_frame, pre_gray, current_gray, pre_gaus, current_gaus;
capture.read(pre_frame);
cvtColor(pre_frame, pre_gray, COLOR_BGR2GRAY);
GaussianBlur(pre_gray, pre_gaus, Size(), 5, 5);
while (capture.read(current_frame))
{
cvtColor(current_frame, current_gray, COLOR_BGR2GRAY