转载请注明出处!

http://blog.csdn.net/zhonghuan1992







背景剪除和OpenCV中的实现







背景与前景都是相对的概念。以快速公路为例:有时我们对快速公路上来来往往的汽车感兴趣,这时汽车是前景。而路面以及周围的环境是背景。有时我们只对闯入快速公路的行人感兴趣,这时闯入者是前景,而包含汽车之类的其它东西又成了背景。背景剪除是使用很广泛的摄像头视频中探測移动的物体。这样的在不同的帧中检測移动的物体叫做背景模型,事实上背景剪除也是前景检測。

一个强劲的背景剪除算法应当可以解决光强的变化,杂波的反复性运动,和长期场景的变动。以下的分析中会是用函数V(x,y,t)表示视频流,t是时间。x和y代表像素点位置。

比如,V(1,2,3)是在t=3时刻。像素点(1,2)的光强。

以下介绍几种背景剪除的方法。

1 利用帧的不同

该方法假定是前景是会动的。而背景是不会动的。而两个帧的不同能够用以下的公式:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhvbmdodWFuMTk5Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

从公式我们能够体会出D(t+1)的含义来,用它来表示同个位置前后不同一时候刻的光强仅仅差。仅仅要把那些D是0的点取出来。就是我们的前景,同一时候也完毕了背景剪除。当然。这里的能够稍作改进,不一定说背景是一定不会动的。能够用一个阀值来限定。

看以下的公式:

通过Th这个阀值来进行限定,把大于Th的点给去掉,留下的就是我们想要的前景。

2 均值滤波(Mean filter)

首先。名字里有Mean了嘛,一般和Mean这个有关系了,那么这个关系是怎么联系上的呢?看以下的公式:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhvbmdodWFuMTk5Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

公式用无声的语言来表达了B(x,y)的意思,同一个点在过去N个帧中的平均光强。好了,有了这个公式,我们就有了均值了。以下看怎么用这个B(x,y)。使用方法非常easy。就是把上面1中的V(x,y,t+1)改为B(x,y),所以公司例如以下:

恩,我想大家可以感受到这个的作用了。不是通过当前帧和上一帧的区别,而是当前帧和过去一段时间的平均区别来进行比較,同一时候通过阀值Th来进行控制。当大于阀值的点去掉。留下的就是我们要的前景了。

3 使用高斯均值:

数学不是太好。遇上高斯这个名字,就认为非常唬人,事实上为什么要这样我不太清楚,求人给出好的简单易懂的解释,而我对这样的情况的做法就是,就是一些规则。这样做的优点我说不上来,以后了解很多其它了,我再回来补充。让我们直接看看它是怎么做的。

首先

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhvbmdodWFuMTk5Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">是均值,

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhvbmdodWFuMTk5Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt=""> 是方差。

看以下的初始化:

这个还是比較明确的。一開始均值就是I0,(開始的时候嘛),方差能够使某个初始值。后面就是用来进行更新。公式例如以下:

好了。公式的更新方式如上,我们能够从效果上来体会上面的公式,以下是一个图,

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhvbmdodWFuMTk5Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

上面的每一个格子。表示的就是一个图的某部分。每一个像素点的情况。你看。每一个格子就想一个小山,我觉的使用高斯分布也是为了这个原因吧,时间离得近的点,影响比較大。时间比較前的点,影响比較小,你假设把上面的公式多展开几层就会感受高了。以下就是推断方式了:

和上面有些像,只是,多了个除方差的环节。当中K是一个自由的阀值,K大了,就会有一些动的部分当成背景了; K小了。前景会有一些静态的部分。

利用OpenCV实现上面的最简单的1中的前景检測。

#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/core/core.hpp>
#include <iostream> #define threshold_diff 10 //设置简单帧差法阈值 using namespace cv;
using namespace std; int main(int argc, unsigned char* argv[])
{
Mat img1, img2, gray1, gray2, bac;
bool pause = false; VideoCapture capture("G:\\视频分析入门练习\\视频分析入门练习 - 附件\\sample.avi");//在这里改对应的文件名称
//读取下一帧
if (!capture.read(img1))
{
cout << "结束" << endl;
capture.release();
return 0;
} while (true)
{
cvtColor(img1, gray1, CV_BGR2GRAY); //读取下一帧
if(!capture.read(img2))
{
cout << "结束" << endl;
capture.release();
return 0;
}
cvtColor(img2, gray2, CV_BGR2GRAY);
imshow("原视频", img2); subtract(gray1, gray2, bac);
for (int i = 0;i<bac.rows; i++)
for (int j = 0;j<bac.cols; j++)
if (abs(bac.at<unsigned char>(i, j)) >= threshold_diff)//这里模板參数一定要用unsigned char,否则就一直报错
bac.at<unsigned char>(i, j) = 255;
else bac.at<unsigned char>(i, j) = 0;
imshow("背景图", bac);
img1 = img2;
waitKey(20);
}
return 0;
}

引用:

http://en.wikipedia.org/wiki/Background_subtraction

http://docs.opencv.org/modules/video/doc/motion_analysis_and_object_tracking.html

S

背景剪除和OpenCV中的实现的更多相关文章

  1. Opencv中KNN背景分割器

    背景分割器BackgroundSubtractor是专门用来视频分析的,会对视频中的每一帧进行"学习",比较,计算阴影,排除检测图像的阴影区域,按照时间推移的方法提高运动分析的结果 ...

  2. OpenCV中cv2的用法

    一.读入图像 使用函数cv2.imread(filepath,flags)读入一副图片 filepath:要读入图片的完整路径 flags:读入图片的标志  cv2.IMREAD_COLOR:默认参数 ...

  3. [OpenCV-Python] OpenCV 中的图像处理 部分 IV (四)

    部分 IVOpenCV 中的图像处理 OpenCV-Python 中文教程(搬运)目录 21 OpenCV 中的轮廓 21.1 初识轮廓目标 • 理解什么是轮廓 • 学习找轮廓,绘制轮廓等 • 函数: ...

  4. [OpenCV-Python] OpenCV 中的图像处理 部分 IV (五)

    部分 IVOpenCV 中的图像处理 OpenCV-Python 中文教程(搬运)目录 22 直方图 22.1 直方图的计算,绘制与分析目标 • 使用 OpenCV 或 Numpy 函数计算直方图 • ...

  5. [OpenCV-Python] OpenCV 中的图像处理 部分 IV (六)

    部分 IVOpenCV 中的图像处理 OpenCV-Python 中文教程(搬运)目录 23 图像变换 23.1 傅里叶变换目标本小节我们将要学习: • 使用 OpenCV 对图像进行傅里叶变换 • ...

  6. [OpenCV-Python] OpenCV 中图像特征提取与描述 部分 V (一)

    部分 V图像特征提取与描述 OpenCV-Python 中文教程(搬运)目录 29 理解图像特征 目标本节我会试着帮你理解什么是图像特征,为什么图像特征很重要,为什么角点很重要等.29.1 解释 我相 ...

  7. [OpenCV-Python] OpenCV 中视频分析 部分 VI

    部分 VI视频分析 OpenCV-Python 中文教程(搬运)目录 39 Meanshift 和 和 Camshift 目标 • 本节我们要学习使用 Meanshift 和 Camshift 算法在 ...

  8. OpenCV中图像算术操作与逻辑操作

    OpenCV中图像算术操作与逻辑操作 在图像处理中有两类最重要的基础操作各自是图像点操作与块操作.简单点说图像点操作就是图像每一个像素点的相关逻辑与几何运算.块操作最常见就是基于卷积算子的各种操作.实 ...

  9. 对OpenCV中seamlessClone的初步实验

    seamlessClone是OpenCV中新出现的函数,应该说如果能够基于较为准确的图像分割,能够得到很好的结果. 原始的前景,背景 三种flag下的融合结果   //注意头文件中添加  #inclu ...

随机推荐

  1. scikit-learn 为机器学习

    如何使用 scikit-learn 为机器学习准备文本数据   欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 文本数据需要特殊处理,然后才能开始将其用于预测建模. 我们需要解析文本,以删除被 ...

  2. win7安装两个jdk,1.7和1.8,下载、安装、配置环境变量,方便切换

    之前用过1.6,后来换电脑后用的1.7,由于时代在发展,许多插件.框架等新的功能需要jdk1.8才能使用,所以就想安装1.8,不过1.7还不准备卸载,就考虑安装多个jdk. 先下载jdk1.8,建议去 ...

  3. 学习NLP:《自然语言处理原理与技术实现(罗刚)》PDF+代码

    自然语言处理技术已经深入我们的日常生活.我们经常用到的搜索引擎就用到了自然语言理解等自然语言处理技术.自然语言处理是一门交叉学科,涉及计算机.数学.语言学等领域的知识. <自然语言处理原理与技术 ...

  4. jQuery获取区间随机数

    1.自定义函数 function getRandom(min,max){    //x上限,y下限    var x = max;    var y = min;    if(x<y){     ...

  5. 手把手教你用vue-cli构建一个简单的路由应用

    上一章说道:十分钟上手-搭建vue开发环境(新手教程)https://www.jianshu.com/p/0c6678671635 开发环境搭建好之后,那么开始新添加一些页面,构建最基本的vue项目, ...

  6. python 服务端判断客户端异常断开

    在进行 python 套接字编程时,服务端程序要判断客户端是否异常断开[由于断电或者其他突发情况导致链接中断],可以通过以下几种方式判断: 1.如果通信协议中,设有心跳包,则可记录上次收到时间,将服务 ...

  7. Hello World (记事本+命令行)

    读完这篇博客.你将对下面几点更有心得: - Java 中的当前路径.类路径等概念 - javac.java 命令的综合使用 - jar 包的创建及引用 创建文件夹准备測试源代码 打包外部依赖 Jar ...

  8. C++ Primer高速入门之六:数组和指针

    更新:勘误,delete [] 猪 我们知道,C语言以及早期的面向结构的语言差点儿都支持数组定义.比方整形数组int 女神[2].表示有俩数: 女神[0], 女神[1].她们都是整数. C++ 语言为 ...

  9. 流媒体技术 rtp/rtcp/rtsp资料精华!

     流媒体技术 rtp/rtcp/rtsp资料精华! 流媒体技术 流媒体是指在网络中使用流式(Sreaming)传输技术进行传输的连续时基媒体.如音频数据流或视频数据流,而不是一种新的媒体.流媒体技 ...

  10. jquery16 DOM操作 : 添加 删除 获取 包装 DOM筛选

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...