前景检测算法_4(opencv自带GMM)
参考: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)相关推荐
- 前景检测算法(四)--GMM
前一篇博客中有谈论到混合高斯模型GMM,但是只是在上面的一个小应用,可能没有很彻底的分析,大部分读者看起来有点吃力,那么在这篇微博中就给大家分析一下GMM在前景检测的原理以及在OpenCV中的运用,当 ...
- 前景检测算法_3(GMM)
摘要 本文通过opencv来实现一种前景检测算法--GMM,算法采用的思想来自论文[1][2][4].在进行前景检测前,先对背景进行训练,对图像中每个背景采用一个混合高斯模型进行模拟,每个背景的混合高 ...
- 前景检测算法_1(codebook和平均背景法)
前景检测算法_1(codebook和平均背景法) 前景分割中一个非常重要的研究方向就是背景减图法,因为背景减图的方法简单,原理容易被想到,且在智能视频监控领域中,摄像机很多情况下是固定的,且背景也是基 ...
- 前景检测算法(二)--codebook和平均背景法
原文:http://www.cnblogs.com/tornadomeet/archive/2012/04/08/2438158.html 前景检测算法_1(codebook和平均背景法) 前景 ...
- 前景检测算法(七)--ViBe算法
原文: http://blog.csdn.net/zouxy09/article/details/9622285 因为监控发展的需求,目前前景检测的研究还是很多的,也出现了很多新的方法和思路.个人了解 ...
- 前景检测算法(三)--帧差法
原文:http://www.cnblogs.com/tornadomeet/archive/2012/05/01/2477629.html 前景检测算法_2(帧差法1) 帧差法是背景减图法中的一 ...
- 前景检测算法(五)--GMM,GMM2,GMG
http://blog.csdn.net/chuhang_zhqr/article/details/51060745 GMM是网上到处可见且用得最多的背景建模算法,论文上很多相关概率公式,又看了 ...
- 前景检测算法(九)--PBAS算法
Pixel-Based Adaptive Segmenter(PBAS)检测算法,是基于像素的无参数模型,该算法结合了SACON和VIBE两个算法的优势,并在这两个算法的基础上改进而来,SACO ...
- 前景检测算法(十二)--基于模糊Choquet积分
原文: http://www.cnblogs.com/pangblog/p/3303956.html 本文根据论文:Fuzzy Integral for Moving Object Detection ...
最新文章
- PyTorch: 序列到序列模型(Seq2Seq)实现机器翻译实战
- 新思路设计可视化大型微服务监控系统
- 面试必问:Spring循环依赖的三种方式
- 可重复使用的MicroProfile Health探针
- 17张图带你解析红黑树的原理!保证你能看懂!
- 密码学基础(数学理论)
- 尤雨溪:重头来过的 Vue 3 带来了什么?
- 宝兰德BES安装及Springboot项目打包部署及websocket解决方案
- 尼古拉·特斯拉,到底有多神?
- mysql 主辅_Mysql的实时同步 - 主辅同步
- 实验室管理系统 可行性分析
- C++实现找100(任意)以内的质数--非常好的算法
- PFM与PWM的技术总结
- 智慧水务,水务自动化无线监控方案
- 【Excel】偷懒小技巧3:金额小写自动转换为大写
- 史上首次,45岁计算机大牛蒋濛当选普渡大学校长!
- 推荐电影一部: 反恐24小时。24Hours
- 《卡门》、《卡门组曲》、《卡门序曲》、《卡门幻想曲》有什么区别和关联?
- 创建maven web项目提示Could not resolve archetype的问题
- 180124 逆向-XMAN结营赛(前方高能)
热门文章
- Design Pattern - State(C#)
- python装饰设备_python装饰器
- android屏幕底部黑块,Android surfaceView 黑块问题
- linux php ldap扩展,php_ldap域集成模块安装-159
- 解决npm ERR! Unexpected end of JSON input while parsing near...的方法
- SSL/TLS协议信息泄露漏洞(CVE-2016-2183)【原理扫描】远程桌面 3389 Windows 2016
- 华为 mysql实例监控,华为云文档数据库服务DDS监控告警全新优化
- java字符串逐个分解_改进JAVA字符串分解的方法
- iphone11看信号强度_iPhone11信号怎么样_iPhone11信号差原因|解决办法-太平洋IT百科...
- 那个能力很强的程序员学历造假,被辞退了!