opencv 运动检测 三帧差法

                                opencv 运动检测 三帧差法

 

 三帧差法 优点:

实时性高

缺点:

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

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

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

 

1. 帧差法基本原理

帧差法的实现非常简单:

opencv 运动检测 三帧差法_第1张图片

 

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

数学原理:

                 

 

 

三帧差法的流程:

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

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

 

直接上代码:

#include 
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    
}

 

运行结果:

opencv 运动检测 三帧差法_第2张图片

 

 

opencv 运动检测 三帧差法_第3张图片

 

希望对你有帮助。

 

 

 

 

 

 

 

 

你可能感兴趣的:(计算机视觉,"进阶",计算机视觉,"入门,",---,OpenCv)