前景检测算法_2(帧差法1)

转载 2015年07月09日 20:18:41

作者:tornadomeet 出处:http://www.cnblogs.com/tornadomeet 

  帧差法是背景减图法中的一种,只不过是帧差法不需要建模,因为它的背景模型就是上一帧的图,所以速度非常快,另外帧差法对缓慢变换的光照不是很敏感,所以其用途还是有的,有不少学者对其做出了出色的改进。

  其基本原理可以用下面公式看出:

  |i(t)-i(t-1)|<T             背景

  |i(t)-i(t-1)|>=T           前景

  其中i(t),i(t-1)分别为t,t-1时刻对应像素点的像素值,T为阈值。

  当然其缺点也不少,容易出现”双影”和”空洞”现象。

  用opencv2.3.1+vs2010做了个简单的实验,其实验代码如下:

复制代码
 1 // frame_diff.cpp : 定义控制台应用程序的入口点。
 2 //
 3 
 4 #include "stdafx.h"
 5 #include <opencv2/highgui/highgui.hpp>
 6 #include <opencv2/imgproc/imgproc.hpp>
 7 #include <opencv2/core/core.hpp>
 8 
 9 #define threshold_diff 20 //设置简单帧差法阈值
10 
11 using namespace cv;
12 using namespace std;
13 
14 int main(int argc,unsigned char* argv[])
15 {
16     Mat img_src1,img_src2,img_dst,gray1,gray2,gray_diff;
17     bool pause=false;
18 
19     VideoCapture vido_file("IndoorGTTest1.avi");//在这里改相应的文件名
20     namedWindow("foreground",0);
21     for (;;)
22     {
23         if(!pause)
24         {
25             vido_file >>img_src1;        //因为视频文件帧数已经固定了,所以每次到这句语句都是读取相邻的帧数,没到时间视频并不向前走
26             cvtColor(img_src1,gray1,CV_BGR2GRAY);
27             imshow("video_src",img_src1);//可以事先不用新建一个窗口
28             waitKey(5);
29 
30             vido_file >>img_src2;
31             cvtColor(img_src2,gray2,CV_BGR2GRAY);
32             imshow("video_src",img_src2);//可以事先不用新建一个窗口
33 
34             waitKey(5);
35             subtract(gray1,gray2,gray_diff);
36             for(int i=0;i<gray_diff.rows;i++)
37                 for(int j=0;j<gray_diff.cols;j++)
38                     if(abs(gray_diff.at<unsigned char>(i,j))>=threshold_diff)//这里模板参数一定要用unsigned char,否则就一直报错
39                         gray_diff.at<unsigned char>(i,j)=255;
40                     else gray_diff.at<unsigned char>(i,j)=0;
41 
42             imshow("foreground",gray_diff);
43         }
44         char c=(char)waitKey(10);
45         if (c==27)
46         {
47             break;    
48         }
49         if(c==' ')
50             pause=!pause;
51     }
52     return 0;
53 }
复制代码

   实验结果如下:

    

  可以看出其“双影”和”空洞”比较明显。双影是由于帧差法有2个影子,在该试验中就是轮廓变得很粗,”空洞”是由于物体内部颜色相近,检测不出来。当然帧差法还有个致命的缺点那就是阈值T需要人工设定。

  对于帧差法的”双影”现象,有人提出来了三帧差法。其原理如下所示:

  1. 由i(t)-i(t-1)得到前景图     F1

  2. 由i(t+1)-i(t)得到前景图    F2

  3.  F1 ∩ F2得到前景图     F3

  4.  形态学处理

  也就是利用2次相邻帧的差,然后去与操作,就得到了真正的那个影子了。

  这个在一定程度上可以解决”双影”现象。

  同样做了个简单的实验,代码如下:

复制代码
 1 // frame_3diff.cpp : 定义控制台应用程序的入口点。
 2 //
 3 
 4 #include "stdafx.h"
 5 #include <opencv2/highgui/highgui.hpp>
 6 #include <opencv2/imgproc/imgproc.hpp>
 7 #include <opencv2/core/core.hpp>
 8 
 9 #define threshold_diff1 10 //设置简单帧差法阈值
10 #define threshold_diff2 10 //设置简单帧差法阈值
11 
12 using namespace cv;
13 using namespace std;
14 
15 int main(int argc,unsigned char* argv[])
16 {
17     Mat img_src1,img_src2,img_src3;//3帧法需要3帧图片
18     Mat img_dst,gray1,gray2,gray3;
19     Mat gray_diff1,gray_diff2;//存储2次相减的图片
20     Mat gray;//用来显示前景的
21     bool pause=false;
22 
23     VideoCapture vido_file("IndoorGTTest1.avi");//在这里改相应的文件名
24     namedWindow("foreground",0);
25     for (;;)
26     {
27         if(!false)
28         {
29             vido_file >>img_src1;
30             cvtColor(img_src1,gray1,CV_BGR2GRAY);
31         
32             waitKey(5);
33             vido_file >>img_src2;
34             cvtColor(img_src2,gray2,CV_BGR2GRAY);
35             imshow("video_src",img_src2);//
36 
37             waitKey(5);
38             vido_file >>img_src3;
39             cvtColor(img_src3,gray3,CV_BGR2GRAY);
40 
41             subtract(gray2,gray1,gray_diff1);//第二帧减第一帧
42             subtract(gray3,gray2,gray_diff2);//第三帧减第二帧
43 
44             for(int i=0;i<gray_diff1.rows;i++)
45                 for(int j=0;j<gray_diff1.cols;j++)
46                 {
47                     if(abs(gray_diff1.at<unsigned char>(i,j))>=threshold_diff1)//这里模板参数一定要用unsigned char,否则就一直报错
48                         gray_diff1.at<unsigned char>(i,j)=255;            //第一次相减阈值处理
49                     else gray_diff1.at<unsigned char>(i,j)=0;
50 
51                     if(abs(gray_diff2.at<unsigned char>(i,j))>=threshold_diff2)//第二次相减阈值处理
52                         gray_diff2.at<unsigned char>(i,j)=255;
53                     else gray_diff2.at<unsigned char>(i,j)=0;
54                 }
55             bitwise_and(gray_diff1,gray_diff2,gray);
56             imshow("foreground",gray);
57         }
58         char c=(char)waitKey(10);
59         if (c==27)
60         {
61             break;    
62         }
63         if(c==' ')
64             pause=!pause;//为什么暂停不了??
65     }
66     return 0;
67 }
复制代码

   实验结果如下:

  

  可以看出,效果并没怎么变好,只是影子轮廓确实变细了,”空洞”现象也没有改善,当然这只是个简单的实验,也没有优化或改进,用的是最原始的思想,没有使用形态学做后期处理。

 (1)vido_file >>img_src1; 
请问您这个语句是什么意思?
(2)程序运行时视频播放到结尾会有以下错误,为什么

(1)vido_file >>img_src1是在opencv的基于c++的版本(貌似opencv2.0以后就开始迈向c++了)的用法,img_src1是一个Mat型矩阵,用来存放读取的图片,vido_file是一个视频操作相关的类,因为在开始时对这个类以经初始化了,是用来读取视频的,所以这句的意思就是将读到的一帧视频数据存入img_src1中。
(2)视频读取完了是会报错的。因为视频读完了,那么就没有数据了,因此img_src1中就为空了,所以后面对于img_src1的操作就会报错。
这个程序写得非常粗糙,你可以加一个判断img_src1(2/3)是否为空的操作在前面.

 

前景目标检测——帧差法

运动目标 前景目标 帧差 学习 背景
  • s6977880
  • s6977880
  • 2016年10月20日 09:02
  • 463

前景检测算法(三)--帧差法

 原文:http://www.cnblogs.com/tornadomeet/archive/2012/05/01/2477629.html 前景检测算法_2(帧差法1)   帧差法是背...
  • App_12062011
  • App_12062011
  • 2016年07月05日 07:59
  • 1454

帧差法前景检测算法

转自:http://www.cnblogs.com/tornadomeet/archive/2012/05/01/2477629.html 帧差法前景检测算法 帧差法是背景减图法中的一...
  • yueguanyun
  • yueguanyun
  • 2016年03月11日 09:37
  • 4404

前景检测算法(九)--PBAS算法

Pixel-Based Adaptive Segmenter(PBAS)检测算法,是基于像素的无参数模型,该算法结合了SACON和VIBE两个算法的优势,并在这两个算法的基础上改进而来,SACON和V...
  • App_12062011
  • App_12062011
  • 2016年07月09日 14:39
  • 2162

opencv-视频处理--实时前景检测-二帧差法

主要思想:通过当前帧的灰度图(currentGrayFrame)和前一帧的灰度图(previousGrayFrame)的差,进行像素级的比较。符号::代表当前帧(x,y)处的灰度值:代表前一帧(x,y...
  • wxcdzhangping
  • wxcdzhangping
  • 2016年07月01日 15:36
  • 8095

前景检测算法(一)--综述

原文: http://www.cnblogs.com/ronny/archive/2012/04/12/2444053.html 背景建模或前景检测的算法主要有: 1. Single Gaussian...
  • App_12062011
  • App_12062011
  • 2016年07月05日 07:49
  • 4987

前景检测算法_4(opencv自带GMM)

前景检测算法_4(opencv自带GMM)   前面已经有3篇博文介绍了背景减图方面相关知识(见下面的链接),在第3篇博文中自己也实现了gmm简单算法,但效果不是很好,下面来体验下opencv自带2...
  • l1l2l3q1q2q3
  • l1l2l3q1q2q3
  • 2017年04月11日 15:26
  • 446

opencv-视频处理-实时前景检测--三帧差法

假设下面的是视频流中的按时间先后顺序的任意三帧图片依次定义它们的灰度图为: ,,代表在任意一点代表定义前两张的灰度的差为:定义后两张的灰度差为:...
  • wxcdzhangping
  • wxcdzhangping
  • 2016年07月07日 09:46
  • 6316

前景检测算法(十)--SOBS算法

 SOBS(self-Organizing through artificial neural networks)是一种基于自组织神经网络的背景差分算法,主要是借鉴神经网络的特性,一个网络输入节...
  • App_12062011
  • App_12062011
  • 2016年07月09日 16:02
  • 1836

前景检测算法 (GMM)

本文通过opencv来实现一种前景检测算法——GMM,算法采用的思想来自论文[1][2][4]。在进行前景检测前,先对背景进行训练,对图像中每个背景采用一个混合高斯模型进行模拟,每个背景的混合高斯的个...
  • u012116229
  • u012116229
  • 2015年05月11日 19:48
  • 1109
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:前景检测算法_2(帧差法1)
举报原因:
原因补充:

(最多只允许输入30个字)