• 背景剪除和OpenCV中的实现


    转载请注明出处!

    http://blog.csdn.net/zhonghuan1992




    背景剪除和OpenCV中的实现







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

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

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

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

    1 利用帧的不同

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

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

    看以下的公式:

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

    2 均值滤波(Mean filter)

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

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

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

    3 使用高斯均值:

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

             首先是均值, 是方差。

    看以下的初始化:

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

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

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

             和上面有些像,只是,多了个除方差的环节。当中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

  • 相关阅读:
    javascript 的继承实例
    [转载]编写高性能js
    弹出菜单
    xml xpath dta笔记
    jquery 学习笔记
    公用的css
    谷歌主页动画效果——利用视距暂留原理
    javascript 新知识
    ie6/7 bug大全
    javascript 原生实现 jquery live/delegate
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/7092521.html
Copyright © 2020-2023  润新知