VIBE运动目标检测算法实现

企鹅博客
18927
文章
0
评论
2020年1月5日20:18:21 评论 0 views 1587字阅读5分17秒

近来,有不少人咨询我关于VIBE算法的问题,而且对于有些细节问题懵懵懂懂,索要源码类的,考虑这个算法的应用以及很多人对此有比较深的兴趣,遂将其放在博客上供大家学习。该版本的代码是在学校的时候写的,里面也加入了一些其他的后处理内容,尽管还有不足,但是对于加深对VIBE算法的理解肯定有一定帮助。另外,由于最新版本的代码在公司电脑上,不便提供。关于理论方面的请参考下面二篇文章:

1)VIBE-A powerful random technique to estimatie the background in video sequences.

2) VIBE-A universal background subtraction algorithms for video sequences

VIBE的头文件Vibe.hpp如下:

#pragma once
#include "stdafx.h"
#define  WINSIZE 3

class Vibe
{
public:
 Vibe(void);
 Vibe(IplImage *img);
 void SetMinMatch(int nthreshold){g_MinMatch=nthreshold;}
 void SetRadius(int radius){g_Radius=radius;}
 void SetSampleNum(int num){g_SampleNum=num;}
 void SetThreshold(double t){g_threshold=t;}
 IplImage* GetForeground(){return g_ForeImg;}
 IplImage* GetSegMask(){return g_SegementMask;}
 void Detect(IplImage *img); 
 void ForegroundCombineEdge(); // 结合边缘信息
 void DeleteSmallAreaInForeground(double minArea=20);//删除小面积区域
 // 实现背景更新机制
 void Update();
 // 实现后处理,主要用形态学算子
 void PostProcess();

public:
 ~Vibe(void);

private: 
 void ClearLongLifeForeground(int i_lifeLength=200); // 清除场景中存在时间较长的像素,i_lifeLength用于控制允许存在的最长时间
 double AreaDense(IplImage *pFr,int AI,int AJ,int W,int H); //计算(i,j)处邻域大小为W×H的密度
 int GetRandom(int istart,int iend); // 默认istart=0,iend=15
 int GetRandom(int random);
 int GetRandom();// 产生一个随机数
 // 计算两个像素之间的欧式距离
 double CalcPixelDist(CvScalar bkCs,CvScalar curCs);
 // 按照Kim的方法来计算颜色畸变
 double CalcuColorDist(CvScalar bkCs,CvScalar curCs);
 int g_SampleNum;// Sample number for the models,默认为20
 int g_MinMatch; // 当前像素与背景模型匹配的最少个数,默认为2
 int g_Height;
 int g_Width;
 int g_Radius;// 球体的半径,默认为20
 int g_offset; //边界的宽和高
 double g_threshold; // 距离度量的阈值
 unsigned char ***g_Model;// 保存背景模型 
 IplImage *g_ForeImg;// 保存前景图
 IplImage *g_Edge;

继续阅读
  • 版权声明: 发表于 2020年1月5日20:18:21
  • 转载注明:https://www.qieseo.com/178342.html
二叉树的Java实现及特点总结 Linux编程

二叉树的Java实现及特点总结

二叉树是一种非常重要的数据结构,它同时具有数组和链表各自的特点:它可以像数组一样快速查找,也可以像链表一样快速添加。但是他也有自己的缺点:删除操作复杂。 我们先介绍一些关于二叉树的概念名词。 二叉树...
C++中的显式类型转换操作符 Linux编程

C++中的显式类型转换操作符

即使类型转换本身是危险的,在有些时候类型转换也是不可或缺的。程序员不使用显式转换,编译器也可能会使用隐式转换,那还不如把代码控制在程序员自己手中。 C++有4种显式类型转换操作符,最好不要使用C语言编...
Java编程:组合、继承和代理的区别 Linux编程

Java编程:组合、继承和代理的区别

组合、继承和代理三者的定义: 组合:在新类中new 另外一个类的对象,以添加该对象的特性。 继承:从基类继承得到子类,获得基类的特性。 代理:在代理类中创建某功能的类,调用类的一些方法以获得该类的部分...
Linux文件编程学习 Linux编程

Linux文件编程学习

在Linux平台下对文件编程可以使用两类函数:(1)Linux操作系统文件API;(2)C语言I/O库函数。 前者依赖于Linux系统调用,后者实际上与操作系统是独立的,因为在任何操作系统下,使用C语...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: