opencv 运动检测 二帧差法
1. 帧差法基本原理
帧间差分法是一种通过对视频图像序列的连续两帧图像做差分运算获取运动目标轮廓的方法。当监控场景中出现异常目标运动时,相邻两帧图像之间会出现较为明显的差别,两帧相减,求得图像对应位置像素值差的绝对值,判断其是否大于某一阈值,进而分析视频或图像序列的物体运动特性。
帧差法的实现非常简单:
如图可见,由目标运动引起的运动变化区域,包括运动目标在前后两帧中的共同位置(图中黑色区域)、在当前帧中新显露出的背景区域和新覆盖的背景区域三部分。
数学原理:
直接上代码:
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
//读入视频
VideoCapture capture("Laboratory_raw.avi");
//VideoCapture capture(0);
Mat tempframe, currentframe, previousframe, difframe;
Mat frame;
int framenum = 0;
//读取一帧处理
while (true)
{
if (!capture.isOpened())
{
cout << "read video failure" << endl;
return -1;
}
//tempframe = capture.read(frame);
capture >> frame;
imshow("原视频", frame);
previousframe = frame.clone();
capture >> frame;
currentframe = frame.clone();
cvtColor(previousframe, previousframe, CV_BGR2GRAY);
cvtColor(currentframe, currentframe, CV_BGR2GRAY);
absdiff(currentframe, previousframe, difframe);//做差求绝对值
threshold(difframe, tempframe, 20, 255.0, CV_THRESH_BINARY);
dilate(tempframe, tempframe, Mat());//膨胀
erode(tempframe, tempframe, Mat());//腐蚀
imshow("运动目标", tempframe);
waitKey(50);
}//end while
}
运行结果:
优缺点
优点:算法实现简单,程序设计复杂度低,运行速度快;动态环境自适应性强,对场景光线变化不敏感。
缺点:“空洞”现象(运动物体内部灰度值相近);“双影”现象(差分图像物体边缘轮廓较粗);不能提取出运动对象的完整区域,仅能提取轮廓;算法效果严重依赖所选取的帧间时间间隔和分割阈值。
希望对你有帮助。