在..\opencv\doc\vidsurv文件夹中有三个doc文件,Blob_Tracking_Modules、Blob_Tracking_Tests、TestSeq,其中Blob_Tracking_Modules必须需要详读的。

FG/BG Detection” module performsforeground/background segmentation for each pixel.

Blob Entering Detection” module uses theresult (FG/BG mask) of “FG/BG Detection” module to detect new blob objectentered to a scene on each frame.

Blob Tracking” module initialized by“Blob Entering Detection” results and tracks each new entered blob.

Trajectory Generation” module performs asaving function. It collects all blobs positions and save each whole blobtrajectory to hard disk when it finished (for example tracking is lost).

Trajectory PostProcessing” moduleperforms a blob trajectory smoothing function. This module is optional and cannot be included in specific pipeline.

OpenCV所提供的这个运动物体跟踪框架只是一个基本的框架,开发者可以根据自己的实际需要对其中的一些模块进行自定义扩展,以满足实际应用中的具体要求。

1、  前景检测模块CvFGDetector:它的输入数据为当前帧图像,输出结果数据为当前帧图像的前景图像(mask)。前景图像是一个和输入的视频帧具有同样大小的二值图像,即如果当前帧中的像素点被判断为运动前景,则前景掩码中相应位置的像素点值为1,否则,相应的像素点值为0。

开发者需要继承CvFGDetector类,并实现其中的纯虚函数。其中在函数Virtual void process(IplImage *pImg){}中写入自己开发的运动目标检测算法。而函数Virtual IplImage *GetMask()是得到前景检测的结果图像,并负责传递到后续的模块中。而函数Virtual void Release()负责一些动态分配内存的释放。

2、  新团块检测模块CvBlobDetector:该模块的作用是检测进入监控范围的新目标的位置和大小。模块的输入是当前帧的前景图像(前景检测模块的结果)和已经检测并标定的团块,输出的结果是新检测到的团块。

开发者可以将虚类实例化,然后将自己的新团块检测算法写入到相应的函数中。

新团块检测模块的处理流程为:首先从前景图像中检测出所有团块,然后将较小的团块(可能是由噪声引起的)和与已经被跟踪团块有重叠的团块丢弃,并对剩余的团块按照大小顺序排列,只保留其中几个比较大的团块(默认为10)。最后利用特定规则筛选,筛选不合标准的团块,将真正的新团块保存到团块列表中。

3、  团块跟踪模块CvBlobTracker:该模块的作用就是在前面两个模块(前景检测模块、新团块检测模块)对运动目标检测的基础上,实现对运动目标的跟踪。此模块的输入为当前帧的前景图像和团块列表以及当前帧图像,输出结果是当前视频帧中所有运动目标的信息,以团块表示(ID,pos,size)。使用新团块检测模块的结果初始化该模块,并跟踪新进入的团块。

开发者根据自己的算法开发相应的跟踪系统时,可以继承该类,然后用自己的算法实现函数Virtural void process(IplImage *pImg,IplImage *pImgFG=NULL)。此虚类中还定义了许多其他的辅助处理函数接口,例如跟踪索引或ID返回指定团块指针的函数,根据索引或ID为指定团块设置参数函数等。

团块跟踪模块的处理流程为:首先从前景图像提取所有团块,并计算团块的质心、宽度和高度;然后对每一个已被跟踪的轨迹,利用卡尔曼滤波器预测该轨迹在当前帧的团块的位置和大小;最后对每个跟踪的轨迹进行处理,寻找离上一帧里的团块最近的当前帧的团块,将此团块添加到跟踪轨迹。

4、轨迹生成模块CvBlobTrackGen:该模块的作用是生成运动目标的运动轨迹,然后将轨迹导出到指定数据库或文件中(如.txt、.csv文件)。该模块的输入是代表当前处理视频帧中各个运动目标的团块,输出结果是存储在指定位置下的轨迹文件。该模块主要是保存操作,它收集所有团块的位置,并在每条轨迹结束时(例如跟踪丢失时或者物体离开场景时)将其保存到硬盘上,同时也可以为每个团块计算一些特征并保存。

5、轨迹后处理模块CvBlobTrackPostProc:该模块的作用是在前一个模块所产生的团块轨迹上做一些处理,例如采用Kalman滤波或平滑滤波处理等。此模块是可选的,可以不包含在处理流程中。它的输入是当前处理图像的所有团块,输出结果是处理后所处理图像的团块列表。

6、轨迹分析模块CvBlobTrackAnalysis:当某个目标跟踪结束后,会产生一个轨迹,CvBlobTrackAnalysis的子类用于对轨迹进行数据分析;

7、跟踪流程模块CvBlobTracterAuto:为了方便开发者开发自己的系统,同时也为了保证系统的模块化设计,OpenCV设计了此虚类描述整个跟踪流程,这个代表整个跟踪流程的虚类将各个模块相互联系起来成为一个有机的整体。本模块将前面提到的五个模块连接起来,形成一个完整的处理流程。

此类中的函数Process负责调用其它各个子模块,首先对背景图像进行更新并检测前景,将获取的前景图像保存于成员变量m_pFG中。获取前景图像后,便依次调用团块跟踪模块(注意:而不是新团块检测模块,这样做的主要目的是先执行跟踪可将当前帧的跟踪结果传入新团块检测模块,以提供新团块检测的准确度。如果团块跟踪在后,则新团块跟踪模块只能与上一帧的团块列表进行比较,新团块检测的准确度将会有所降低),轨迹后处理模块,团块检测模块,轨迹生成模块,轨迹分析模块。

如果想将自己实现的算法加入到以上模块中也很方便,如将背景差分算法加入到前景检测模块中,只要继承CvFGDetector类,然后主要在Process函数中实现自己的算法就可以了。

原始代码中,用红色标注运动目标的表示跟踪不稳定,绿色则表示稳定跟踪。

轨迹生成模块中默认有两种方法实现数据的保存,其中一种是”RawTracks”方法,每行存放一个运动目标数据,单位为像素,依次为运动目标出现的起始帧,运动目标中心x坐标,运动目标中心y坐标,运动目标宽度,运动目标高度,运动目标中心x坐标,运动目标中心y坐标,运动目标宽度,运动目标高度,……。

参考文献:

1、http://www.doc88.com/p-896576154875.html

2、http://blog.csdn.net/wk119911/article/details/7664478

3、http://www.opencv.org.cn/forum/viewtopic.php?t=11128

OpenCV运动检测跟踪(blob track)框架组成模块详解相关推荐

  1. pythonmessage用法_django 消息框架 message使用详解

    前言 在网页应用中,我们经常需要在处理完表单或其它类型的用户输入后,显示一个通知信息给用户. 对于这个需求,Django提供了基于Cookie或者会话的消息框架messages,无论是匿名用户还是认证 ...

  2. python哪个关键字可以导入模块_关于python导入模块import与常见的模块详解

    0.什么是python模块?干什么的用的? Java中如果使用abs()函数,则需要需要导入Math包,同样python也是封装的,因为python提供的函数太多,所以根据函数的功能将其封装在不同的m ...

  3. [系统安全] 四十五.APT系列(10)Metasploit后渗透技术信息收集、权限提权和功能模块详解

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  4. 定时任务框架APScheduler学习详解

    定时任务框架APScheduler学习详解 APScheduler简介 在平常的工作中几乎有一半的功能模块都需要定时任务来推动,例如项目中有一个定时统计程序,定时爬出网站的URL程序,定时检测钓鱼网站 ...

  5. spring(7)---深入理解Spring核心技术——Spring中的各模块详解

    深入理解Spring核心技术--Spring中的各模块详解 Spring框架的两个基本概念IOC容器和AOP,相信大家现在对Spring中的这两个部分的基本概念有了一定的认识,好了,那么今天我们就来正 ...

  6. python中common在哪个模块导入_python的常用模块之collections模块详解

    认识模块 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编写的 ...

  7. Python之ruamel.yaml模块详解(三)| ruamel.yaml与pyyaml的区别

    Python之ruamel.yaml模块详解(三)| ruamel.yaml与pyyaml的区别 12 默认支持Yaml1.2 13 Py2和Py3重新整合 14 修复 15 测试 16 API 接前 ...

  8. mod_rewrite模块详解(转)

    mod_rewrite模块详解(转)[@more@] Apache模块 mod_rewrite mod_rewrite模块提供了一个基于规则的(使用正则表达式分析器的)实时转向URL请求的引擎.支持每 ...

  9. OpenCV实战(16)——角点检测详解

    OpenCV实战(16)--角点检测详解 0. 前言 1. Harris 特征检测器 1.1 检测 Harris 角点 1.2 cv::cornerHarris 函数参数 2. 可追踪的良好特征 3. ...

最新文章

  1. SoftGrid教程-注意事项、错误代码
  2. 【c++内存分布系列】单独一个类
  3. 消息机制(GUI线程讲解)
  4. java socket 连接异常_java.net.SocketException:软件导致连接中止:套接字写错误
  5. document.createDocumentFragment 以及创建节点速度比较
  6. 前馈神经网络中的前馈_前馈神经网络在基于趋势的交易中的有效性(1)
  7. pandas 按照固定的列顺序排序,并补足缺失列
  8. leetcode力扣406. 根据身高重建队列
  9. Mellanox刘通:开放的理念让Mellanox的优势愈加凸显
  10. 2018我们要赢 (5 分)
  11. 【图论】用链式前向星(邻接表)存有向图(图文代码逐句分析)
  12. Xcode - Plugins And Themes
  13. 24岁,一门手艺,年入百万
  14. Linux下通过rdesktop连接Windows远程桌面
  15. python柱形图绘制_Python绘图之柱形图绘制详解
  16. windows+Texstudio+languagetool修改语法错误
  17. 那些黑科技感爆棚的可视化大屏,是怎么做出来的?模板直接套用
  18. js简单插件(饼形图)
  19. 美8家最具潜力新公司:在线旅游和新媒体居多
  20. VLC-2.2.6命令行帮助文件

热门文章

  1. MXNET源码中NDArray数据的获取和打印
  2. 剑指offer:面试题14- II. 剪绳子 II
  3. 强化学习(五) - 时序差分学习(Temporal-Difference Learning)及其实例----Sarsa算法, Q学习, 期望Sarsa算法
  4. 【强势来袭】Node.js(nodejs)实现“一口多用”(含用户创建、登录、鉴权token) 一个文件解决所有常态化需求
  5. linux下远程传输文件命令scp使用注解
  6. 单机 “5千万以上“ 工业级 LRU cache 实现
  7. C语言的单链表逆序和指定范围逆序
  8. [转]Java中常用的集合—初学者的你不可错过的精编整理
  9. 良好的用户体验应该...
  10. Spring之事务管理配置