OpenCV 运动检测 三帧差法 C++

举报
一颗小树x 发表于 2020/12/18 23:16:01 2020/12/18
【摘要】 三帧差法 优点:实时性高缺点:1、运动物体本身颜色相近时,会出现较大的空洞。2、无法应对光照骤变的情况理论上:三帧差法 比 二帧差法更好一些(可在一定程度上消除帧间差分法的“双影”现象),但是也要结合实际情况而用。1. 帧差法基本原理帧差法的实现非常简单:如图可见,由目标运动引起的运动变化区域,包括运动目标在前后两帧中的共同位置(图中黑色区域)、在当前帧中新显露出的背景区域和新覆盖的背景区域...

三帧差法 优点:

实时性高

缺点:

1、运动物体本身颜色相近时,会出现较大的空洞。

2、无法应对光照骤变的情况

理论上:三帧差法 比 二帧差法更好一些(可在一定程度上消除帧间差分法的“双影”现象),但是也要结合实际情况而用。

1. 帧差法基本原理

帧差法的实现非常简单:

如图可见,由目标运动引起的运动变化区域,包括运动目标在前后两帧中的共同位置(图中黑色区域)、在当前帧中新显露出的背景区域和新覆盖的背景区域三部分。

数学原理:

2. 三帧差法的流程:

1 结果1 = (第二幅图像 - 第一幅图像) ∩ (第三幅图像 - 第二幅图像) 
2 结果2 = 滤波(结果1) 
3 结果3 = 形态学处理(结果2) 
4 结果4 = 二值化(结果3)

第一步:第二幅图像减去第一幅图像的值与第三幅图像减去第二幅图像的值作交集运算. 
 对第一步产生的结果做滤波处理. 
 对第二步产生的结果做形态学处理. 
对第三步产生的结果做二值化处理.

直接上代码:

#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
 
int main()
{
	//读入视频  
	VideoCapture capture("1.avi");  //Laboratory_raw.avi
	//VideoCapture capture(0);
 
	Mat tempframe, currentframe, previousframe, difframe,s3;
	Mat difframe2, difframe3;
	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();   //第二帧
 
		capture >> frame;
		s3 = frame.clone();            //第三帧
 
		cvtColor(previousframe, previousframe, CV_BGR2GRAY);
		cvtColor(currentframe, currentframe, CV_BGR2GRAY);
		cvtColor(s3,s3, CV_BGR2GRAY); 
 
 
		absdiff(currentframe, previousframe, difframe);//做差求绝对值   1-2  
		absdiff(previousframe, s3, difframe2);//做差求绝对值            2-3
		
		
       //准备做与运算,difframe3= difframe2^difframe
		// void bitwise_and(InputArray src1, InputArray src2,OutputArray dst, InputArray mask=noArray());//dst = src1 & src2
		bitwise_and(difframe, difframe2, difframe3);  //
 
 
		threshold(difframe3, tempframe, 20, 255.0, CV_THRESH_BINARY);
		dilate(tempframe, tempframe, Mat());//膨胀  
		erode(tempframe, tempframe, Mat());//腐蚀
 
		imshow("运动目标", tempframe);
 
		waitKey(50);
	}//end while    
}

运行结果:

希望对你有帮助。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。