运动目标的分类(给团块标上ID)不仅仅只是考虑运动跟踪算法,同时它也涉及到新团块的分析、团块的交叉与重叠等问题,单纯的运动跟踪算法并不解决这些问题。
opencv2.1自带的跟踪算法有如下几个:
1. CCMSPF - connected component tracking and MSPF resolver for collision
2. CC - Simple connected component tracking
3. MS - Mean shift algorithm
4. MSFG - Mean shift algorithm with FG mask using
5. MSPF - Particle filtering based on MS weight
第一个是CC与MSPF算法的结合,第二个不太了解,第三个meanshift的原始算法,第四个是meanshift的改进算法,第五个是粒子滤波算法。
针对项目目前使用的跟踪dll ,在实际的监控环境中, 通过观察,我们可以看出:一旦有团块相互交叉的时候,跟踪的时候就特别慢,交叉的团块数量越多,算法速度越慢;在没有团块交叉重叠的情况下,即使跟踪的运动目标数量比较多,算法的速度也没有明显的变慢。
为了发现原因所在,查看分析了目前项目的使用的跟踪dll的源码。不难看出,目前的跟踪算法其实使用的就是opencv2.1自带的跟踪算法,只是因为项目需要,由小组成员封成了规范的接口。源码中很清晰的显示我们用的跟踪算法用的是CCMSPF,该算法能够有效处理团块的交叉重叠问题,跟踪的正确性也相比其他几个要好,但是与此同时,因为引入了交叉重叠问题的处理机制,在监控时,如果图像中有目标相互交叉重叠,势必会引起计算量的大幅增加,导致了算法速度下降,不能很好满足监控的实时性。
通过算法效果对比观察, 相比CCMSPF,MSFG算法中没有包含处理团块的交叉重叠问题,因此MSFG在算法速度上比较稳定,不会受到团块交叉重叠的影响,但是这种算法会将重叠后分开的团块都认为是新的团块,导致跟踪的不正确性(对于视频摘要,这是极不可取的)。
通过以上叙述,目前有两种选择:
1 选择CCMSPF算法,优点:跟踪准确性高,缺点:重叠交叉时算法无法达到实时性的要求;
2 选择MSFG算法,优点:能够满足实时性要求,缺点:跟踪准确性较低。
两种算法都不能做到即能准确跟踪又能做到跟踪的实时性,那么我们考虑以下几种解决办法:
1 改进算法(短时间不太可能);
2 修改CCMSPF中处理团块交叉重叠的机制或是或是优化该段代码;
3 利用其他的算法代替opencv中的算法。
对于第一种解决办法,尝试仔细看过了mean-shift跟踪算法的原始论文后,从算法原理来看,该算法是基于颜色直方图的距离最小化实现的,个人认为即使有再好的改进方法,也无法做到突破性的效果改善。
第二种解决办法还未尝试。
第三种解决办法尝试了CamShift算法(号称meanshift的改进版本),从网上download源码后,调试运行,跟踪效果其实与mean-shift相差无几,对于内容复杂的视频文件,基本上跟踪不上,比压缩传感算法效果差。
无奈只有到网上搜索资料,其中有几个好的参考资料与想法:
1 http://www.roborealm.com/help/Blob_Tracking.php,国外的RoboRealm的开源项目
2 http://nuigroup.com/forums/viewthread/2219/,stackoverflow和opencv官网论坛中也有提到,目标分类的方法为:首先对图像进行目标检测,求取团块;然后对于前一帧和当前帧图像中的团块,直接用团块的中心坐标距离来做判断,如果距离在一个阈值内,则认为两个团块具有相同的ID。个人分析,该方法对团块的提取具有苛刻的要求,一旦前景检测效果不好,算法就无法使用;
3 openTLD,中文名称为捕食者算法,csdn首页之前对算法做过介绍,资料见:http://www.csdn.net/article/2011-04-15/295938,Predator:比微软Kinect更强的视频追踪算法-来自捷克博士论文。从网上下载到源码后和demo可执行程序,配置好运行环境后,运行demo,从效果来看,比压缩传感方法效果还要好,不过可惜提供的为matlab代码,无从下手。尝试到网上下载C++版本的源代码,下载速度过慢,暂时未成功。
下阶段很迷茫,求高人指点。