前景检测算法_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

相关文章

opencv实现像素统计的示例代码

《opencv实现像素统计的示例代码》本文介绍了OpenCV中统计图像像素信息的常用方法和函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 统计像素值的基本信息2. 统计像素值的直方图3. 统计像素值的总和4. 统计非零像素的数量

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费