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

2024-01-25 15:48

本文主要是介绍前景检测算法_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 functions16 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,迭代次数为niters38     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 color50     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 functions16 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 color50     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)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/643760

相关文章

Linux系统性能检测命令详解

《Linux系统性能检测命令详解》本文介绍了Linux系统常用的监控命令(如top、vmstat、iostat、htop等)及其参数功能,涵盖进程状态、内存使用、磁盘I/O、系统负载等多维度资源监控,... 目录toppsuptimevmstatIOStatiotopslabtophtopdstatnmon

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

C++ 检测文件大小和文件传输的方法示例详解

《C++检测文件大小和文件传输的方法示例详解》文章介绍了在C/C++中获取文件大小的三种方法,推荐使用stat()函数,并详细说明了如何设计一次性发送压缩包的结构体及传输流程,包含CRC校验和自动解... 目录检测文件的大小✅ 方法一:使用 stat() 函数(推荐)✅ 用法示例:✅ 方法二:使用 fsee

Python如何将OpenCV摄像头视频流通过浏览器播放

《Python如何将OpenCV摄像头视频流通过浏览器播放》:本文主要介绍Python如何将OpenCV摄像头视频流通过浏览器播放的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完... 目录方法1:使用Flask + MJPEG流实现代码使用方法优点缺点方法2:使用WebSocket传输视

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

如何确定哪些软件是Mac系统自带的? Mac系统内置应用查看技巧

《如何确定哪些软件是Mac系统自带的?Mac系统内置应用查看技巧》如何确定哪些软件是Mac系统自带的?mac系统中有很多自带的应用,想要看看哪些是系统自带,该怎么查看呢?下面我们就来看看Mac系统内... 在MAC电脑上,可以使用以下方法来确定哪些软件是系统自带的:1.应用程序文件夹打开应用程序文件夹

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.

C/C++中OpenCV 矩阵运算的实现

《C/C++中OpenCV矩阵运算的实现》本文主要介绍了C/C++中OpenCV矩阵运算的实现,包括基本算术运算(标量与矩阵)、矩阵乘法、转置、逆矩阵、行列式、迹、范数等操作,感兴趣的可以了解一下... 目录矩阵的创建与初始化创建矩阵访问矩阵元素基本的算术运算 ➕➖✖️➗矩阵与标量运算矩阵与矩阵运算 (逐元