在..\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