参考:https://www.cnblogs.com/tornadomeet/archive/2012/06/02/2531705.html

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

  前面已经有3篇博文介绍了背景减图方面相关知识(见下面的链接),在第3篇博文中自己也实现了gmm简单算法,但效果不是很好,下面来体验下opencv自带2个gmm算法。

  opencv实现背景减图法1(codebook和平均背景法)

  http://www.cnblogs.com/tornadomeet/archive/2012/04/08/2438158.html

  opencv实现背景减图法2(帧差法)

  http://www.cnblogs.com/tornadomeet/archive/2012/05/01/2477629.html

  opencv实现背景减图法3(GMM)

  http://www.cnblogs.com/tornadomeet/archive/2012/06/02/2531565.html

  工程环境opencv2.3.1+vs2010

  实现功能:与上面第三篇博文一样,完成动态背景的训练,来检测前景。

  数据来源和前面的一样: http://research.microsoft.com/en-us/um/people/jckrumm/WallFlower/TestImages.htm 由于该数据是286张bmp格式的图片,所以用的前200张图片来作为GMM参数训练,后186张作为测试。训练的过程中树枝被很大幅度的摆动,测试过程中有行人走动,该行人是需要迁就检测的部分。

  Opencv自带的gmm算法1的实验结果如下:

  

  

  

  其工程代码如下:

  1 // gmm_wavetrees.cpp : 定义控制台应用程序的入口点。
  2 //
  3
  4 #include "stdafx.h"
  5
  6 #include "opencv2/core/core.hpp"
  7 #include "opencv2/video/background_segm.hpp"
  8 #include "opencv2/highgui/highgui.hpp"
  9 #include "opencv2/imgproc/imgproc.hpp"
 10 #include <stdio.h>
 11
 12 using namespace std;
 13 using namespace cv;
 14
 15 //this is a sample for foreground detection functions
 16 string src_img_name="WavingTrees/b00";
 17 const char *src_img_name1;
 18 Mat img, fgmask, fgimg;
 19 int i=-1;
 20 char chari[500];
 21 bool update_bg_model = true;
 22 bool pause=false;
 23
 24 //第一种gmm,用的是KaewTraKulPong, P. and R. Bowden (2001).
 25 //An improved adaptive background mixture model for real-time tracking with shadow detection.
 26 BackgroundSubtractorMOG bg_model;
 27
 28 void refineSegments(const Mat& img, Mat& mask, Mat& dst)
 29 {
 30     int niters = 3;
 31
 32     vector<vector<Point> > contours;
 33     vector<Vec4i> hierarchy;
 34
 35     Mat temp;
 36
 37     dilate(mask, temp, Mat(), Point(-1,-1), niters);//膨胀,3*3的element,迭代次数为niters
 38     erode(temp, temp, Mat(), Point(-1,-1), niters*2);//腐蚀
 39     dilate(temp, temp, Mat(), Point(-1,-1), niters);
 40
 41     findContours( temp, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );//找轮廓
 42
 43     dst = Mat::zeros(img.size(), CV_8UC3);
 44
 45     if( contours.size() == 0 )
 46         return;
 47
 48     // iterate through all the top-level contours,
 49     // draw each connected component with its own random color
 50     int idx = 0, largestComp = 0;
 51     double maxArea = 0;
 52
 53     for( ; idx >= 0; idx = hierarchy[idx][0] )//这句没怎么看懂
 54     {
 55         const vector<Point>& c = contours[idx];
 56         double area = fabs(contourArea(Mat(c)));
 57         if( area > maxArea )
 58         {
 59             maxArea = area;
 60             largestComp = idx;//找出包含面积最大的轮廓
 61         }
 62     }
 63     Scalar color( 0, 255, 0 );
 64     drawContours( dst, contours, largestComp, color, CV_FILLED, 8, hierarchy );
 65 }
 66
 67 int main(int argc, const char** argv)
 68 {
 69     bg_model.noiseSigma = 10;
 70     img=imread("WavingTrees/b00000.bmp");
 71     if(img.empty())
 72     {
 73         namedWindow("image",1);//不能更改窗口
 74         namedWindow("foreground image",1);
 75         namedWindow("mean background image", 1);
 76     }
 77     for(;;)
 78     {
 79         if(!pause)
 80         {
 81         i++;
 82         itoa(i,chari,10);
 83         if(i<10)
 84         {
 85             src_img_name+="00";
 86         }
 87         else if(i<100)
 88         {
 89             src_img_name+="0";
 90         }
 91         else if(i>285)
 92         {
 93             i=-1;
 94         }
 95         if(i>=230)
 96             update_bg_model=false;
 97         else update_bg_model=true;
 98
 99         src_img_name+=chari;
100         src_img_name+=".bmp";
101
102         img=imread(src_img_name);
103         if( img.empty() )
104             break;
105
106         //update the model
107         bg_model(img, fgmask, update_bg_model ? 0.005 : 0);//计算前景mask图像,其中输出fgmask为8-bit二进制图像,第3个参数为学习速率
108         refineSegments(img, fgmask, fgimg);
109
110         imshow("image", img);
111         imshow("foreground image", fgimg);
112
113         src_img_name="WavingTrees/b00";
114
115         }
116         char k = (char)waitKey(80);
117         if( k == 27 ) break;
118
119         if( k == ' ' )
120         {
121             pause=!pause;
122         }
123     }
124
125     return 0;
126 }

  Opencv自带的gmm算法2的实验结果如下:

  

  

  

  其工程代码如下:

  1 // gmm2_wavetrees.cpp : 定义控制台应用程序的入口点。
  2 //
  3
  4 #include "stdafx.h"
  5
  6 #include "opencv2/core/core.hpp"
  7 #include "opencv2/video/background_segm.hpp"
  8 #include "opencv2/highgui/highgui.hpp"
  9 #include "opencv2/imgproc/imgproc.hpp"
 10 #include <stdio.h>
 11
 12 using namespace std;
 13 using namespace cv;
 14
 15 //this is a sample for foreground detection functions
 16 string src_img_name="WavingTrees/b00";
 17 const char *src_img_name1;
 18 Mat img, fgmask, fgimg;
 19 int i=-1;
 20 char chari[500];
 21 bool update_bg_model = true;
 22 bool pause=false;
 23
 24 //第一种gmm,用的是KaewTraKulPong, P. and R. Bowden (2001).
 25 //An improved adaptive background mixture model for real-time tracking with shadow detection.
 26 BackgroundSubtractorMOG2 bg_model;
 27
 28 void refineSegments(const Mat& img, Mat& mask, Mat& dst)
 29 {
 30     int niters = 3;
 31
 32     vector<vector<Point> > contours;
 33     vector<Vec4i> hierarchy;
 34
 35     Mat temp;
 36
 37     dilate(mask, temp, Mat(), Point(-1,-1), niters);
 38     erode(temp, temp, Mat(), Point(-1,-1), niters*2);
 39     dilate(temp, temp, Mat(), Point(-1,-1), niters);
 40
 41     findContours( temp, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );
 42
 43     dst = Mat::zeros(img.size(), CV_8UC3);
 44
 45     if( contours.size() == 0 )
 46         return;
 47
 48     // iterate through all the top-level contours,
 49     // draw each connected component with its own random color
 50     int idx = 0, largestComp = 0;
 51     double maxArea = 0;
 52
 53     for( ; idx >= 0; idx = hierarchy[idx][0] )
 54     {
 55         const vector<Point>& c = contours[idx];
 56         double area = fabs(contourArea(Mat(c)));
 57         if( area > maxArea )
 58         {
 59             maxArea = area;
 60             largestComp = idx;
 61         }
 62     }
 63     Scalar color( 255, 0, 0 );
 64     drawContours( dst, contours, largestComp, color, CV_FILLED, 8, hierarchy );
 65 }
 66
 67 int main(int argc, const char** argv)
 68 {
 69     img=imread("WvingTrees/b00000.bmp");
 70     if(img.empty())
 71     {
 72         namedWindow("image",1);//不能更改窗口
 73         //cvNamedWindow("image",0);
 74         namedWindow("foreground image",1);
 75     //    namedWindow("mean background image", 1);
 76     }
 77     for(;;)
 78     {
 79         if(!pause)
 80         {
 81             i++;
 82             itoa(i,chari,10);
 83             if(i<10)
 84             {
 85                 src_img_name+="00";
 86             }
 87             else if(i<100)
 88             {
 89                 src_img_name+="0";
 90             }
 91             else if(i>285)
 92             {
 93                 i=-1;
 94             }
 95         //    if(i>=230)
 96         //        update_bg_model=false;
 97         //    else update_bg_model=true;
 98
 99             src_img_name+=chari;
100             src_img_name+=".bmp";
101
102             img=imread(src_img_name);
103             if( img.empty() )
104                 break;
105
106             //update the model
107             bg_model(img, fgmask, update_bg_model ? 0.005 : 0);//计算前景mask图像,其中输出fgmask为8-bit二进制图像,第3个参数为学习速率
108             refineSegments(img, fgmask, fgimg);
109
110             imshow("foreground image", fgimg);
111             imshow("image", img);
112
113             src_img_name="WavingTrees/b00";
114
115         }
116         char k = (char)waitKey(100);
117         if( k == 27 ) break;
118
119         if( k == ' ' )
120         {
121             pause=!pause;
122         }
123     }
124
125     return 0;
126 }

  可以看出gmm1效果比gmm2的好,但是研究发现,gmm2是在gmm1上改进的,不会越该越差吧,除非2个函数的使用方法不同(虽然函数形式一样),也就是说相同的参数值对函数功能的影响不同。以后有时间在研究了。

前景检测算法_4(opencv自带GMM)相关推荐

  1. 前景检测算法(四)--GMM

    前一篇博客中有谈论到混合高斯模型GMM,但是只是在上面的一个小应用,可能没有很彻底的分析,大部分读者看起来有点吃力,那么在这篇微博中就给大家分析一下GMM在前景检测的原理以及在OpenCV中的运用,当 ...

  2. 前景检测算法_3(GMM)

    摘要 本文通过opencv来实现一种前景检测算法--GMM,算法采用的思想来自论文[1][2][4].在进行前景检测前,先对背景进行训练,对图像中每个背景采用一个混合高斯模型进行模拟,每个背景的混合高 ...

  3. 前景检测算法_1(codebook和平均背景法)

    前景检测算法_1(codebook和平均背景法) 前景分割中一个非常重要的研究方向就是背景减图法,因为背景减图的方法简单,原理容易被想到,且在智能视频监控领域中,摄像机很多情况下是固定的,且背景也是基 ...

  4. 前景检测算法(二)--codebook和平均背景法

     原文:http://www.cnblogs.com/tornadomeet/archive/2012/04/08/2438158.html 前景检测算法_1(codebook和平均背景法) 前景 ...

  5. 前景检测算法(七)--ViBe算法

    原文: http://blog.csdn.net/zouxy09/article/details/9622285 因为监控发展的需求,目前前景检测的研究还是很多的,也出现了很多新的方法和思路.个人了解 ...

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

     原文:http://www.cnblogs.com/tornadomeet/archive/2012/05/01/2477629.html 前景检测算法_2(帧差法1) 帧差法是背景减图法中的一 ...

  7. 前景检测算法(五)--GMM,GMM2,GMG

    http://blog.csdn.net/chuhang_zhqr/article/details/51060745  GMM是网上到处可见且用得最多的背景建模算法,论文上很多相关概率公式,又看了 ...

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

     Pixel-Based Adaptive Segmenter(PBAS)检测算法,是基于像素的无参数模型,该算法结合了SACON和VIBE两个算法的优势,并在这两个算法的基础上改进而来,SACO ...

  9. 前景检测算法(十二)--基于模糊Choquet积分

    原文: http://www.cnblogs.com/pangblog/p/3303956.html 本文根据论文:Fuzzy Integral for Moving Object Detection ...

最新文章

  1. PyTorch: 序列到序列模型(Seq2Seq)实现机器翻译实战
  2. 新思路设计可视化大型微服务监控系统
  3. 面试必问:Spring循环依赖的三种方式
  4. 可重复使用的MicroProfile Health探针
  5. 17张图带你解析红黑树的原理!保证你能看懂!
  6. 密码学基础(数学理论)
  7. 尤雨溪:重头来过的 Vue 3 带来了什么?
  8. 宝兰德BES安装及Springboot项目打包部署及websocket解决方案
  9. 尼古拉·特斯拉,到底有多神?
  10. mysql 主辅_Mysql的实时同步 - 主辅同步
  11. 实验室管理系统 可行性分析
  12. C++实现找100(任意)以内的质数--非常好的算法
  13. PFM与PWM的技术总结
  14. 智慧水务,水务自动化无线监控方案
  15. 【Excel】偷懒小技巧3:金额小写自动转换为大写
  16. 史上首次,45岁计算机大牛蒋濛当选普渡大学校长!
  17. 推荐电影一部: 反恐24小时。24Hours
  18. 《卡门》、《卡门组曲》、《卡门序曲》、《卡门幻想曲》有什么区别和关联?
  19. 创建maven web项目提示Could not resolve archetype的问题
  20. 180124 逆向-XMAN结营赛(前方高能)

热门文章

  1. Design Pattern - State(C#)
  2. python装饰设备_python装饰器
  3. android屏幕底部黑块,Android surfaceView 黑块问题
  4. linux php ldap扩展,php_ldap域集成模块安装-159
  5. 解决npm ERR! Unexpected end of JSON input while parsing near...的方法
  6. SSL/TLS协议信息泄露漏洞(CVE-2016-2183)【原理扫描】远程桌面 3389 Windows 2016
  7. 华为 mysql实例监控,华为云文档数据库服务DDS监控告警全新优化
  8. java字符串逐个分解_改进JAVA字符串分解的方法
  9. iphone11看信号强度_iPhone11信号怎么样_iPhone11信号差原因|解决办法-太平洋IT百科...
  10. 那个能力很强的程序员学历造假,被辞退了!