OpenCV1.0中运动模板例程

来源:互联网 发布:义乌摄影美工培训学校 编辑:程序博客网 时间:2024/06/05 07:36
原文地址:OpenCV1.0中运动模板例程作者:1835541013
OpenCV1.0samplesc下的例程motempl是应用运动模板中相关函数,今天主要看了一下其中应用的函数,试了一下效果。大概思路就是:获得当前帧与上一帧的差,然后对差图像进行二值化;更新运动历史图像;然后计算运动历史图像的梯度方向,并将整个运动分割为独立的运动部分,再用一个结构序列标记每一个运动分割,最后计算选择区域的全局运动方向,从而获得运动目标的质心位置与运动方向。说明一下几个重要函数:

UpdateMotionHistory 去掉影像(silhouette)以更新运动历史图像

void cvUpdateMotionHistory( const CvArr* silhouette, CvArr*mhi, doubletimestamp, double duration );
silhouette 影像mask,运动发生地方具有非零象素
mhi 运动历史图像(单通道,32-比特 浮点数),为本函数所更新
timestamp 当前时间,毫秒或其它单位
duration 运动跟踪的最大持续时间,用timestamp 一样的时间单位 


函数 cvUpdateMotionHistory 用下面方式更新运动历史图像:

mhi(x,y)=timestamp if silhouette(x,y)!=0
mhi(x,y)=           ifsilhouette(x,y)=0 andmhi(x,y)<timestamp-duration
mhi(x,y)= mhi(x,y)  otherwise
也就是,MHI(motionhistory image) 中在运动发生的象素点被设置为当前时间戳,而运动发生较久的象素点被清除。

CalcMotionGradient 计算运动历史图像的梯度方向
void cvCalcMotionGradient( const CvArr* mhi, CvArr* mask, CvArr*orientation,double delta1, double delta2, int aperture_size=3);
mhi 运动历史图像
mask Mask 图像;用来标注运动梯度数据正确的点,为输出参数。
orientation 运动梯度的方向图像,包含从 0 到 360 角度
delta1, delta2 函数在每个象素点 (x,y) 邻域寻找 MHI 的最小值 (m(x,y)) 和最大值(M(x,y)),并且假设梯度是正确的,当且仅当:
min(delta1,delta2) <= M(x,y)-m(x,y)<= max(delta1,delta2).
aperture_size
函数所用微分算子的开孔尺寸 CV_SCHARR, 1, 3, 5 or 7 (见cvSobel). 

函数 cvCalcMotionGradient 计算 MHI 的差分 Dx 和 Dy ,然后计算梯度方向如下式:
orientation(x,y)=arctan(Dy(x,y)/Dx(x,y))
其中都要考虑 Dx(x,y)' 和 Dy(x,y)' 的符号 (如 cvCartToPolar 类似). 然后填充 mask以表示哪些方向是正确的(见 delta1 和delta2 的描述). 
SegmentMotion将整个运动分割为独立的运动部分
CvSeq* cvSegmentMotion( const CvArr* mhi, CvArr* seg_mask,CvMemStorage* storage, double timestamp, doubleseg_thresh );
mhi 运动历史图像
seg_mask 发现应当存储的 mask 的图像, 单通道, 32bits, 浮点数.
storage 包含运动连通域序列的内存存储仓
timestamp 当前时间,毫秒单位
seg_thresh 分割阈值,推荐等于或大于运动历史“每步”之间的间隔。
函数 cvSegmentMotion 寻找所有的运动分割,并且在seg_mask用不同的单独数字(1,2,...)标识它们。它也返回一个具有 CvConnectedComp结构的序列,其中每个结构对应一个运动部件。在这之后,每个运动部件的运动方向就可以被函数 cvCalcGlobalOrientation利用提取的特定部件的掩模(mask)计算出来(使用 cvCmp)
CalcGlobalOrientation 计算某些选择区域的全局运动方向
double cvCalcGlobalOrientation( const CvArr* orientation, constCvArr* mask, const CvArr* mhi,
double timestamp, double duration );
orientation
运动梯度方向图像,由函数 cvCalcMotionGradient 得到
mask Mask 图像. 它可以是正确梯度 mask (由函数 cvCalcMotionGradient 得到)与区域 mask的结合,其中区域 mask 确定哪些方向需要计算。
mhi 运动历史图象
timestamp 当前时间(单位毫秒或其它)最好在传递它到函数 cvUpdateMotionHistory之前存储一下以便以后的重用,因为对大图像运行 cvUpdateMotionHistory 和 cvCalcMotionGradient会花费一些时间
duration 运动跟踪的最大持续时间,用法与 cvUpdateMotionHistory 中的一致
函数 cvCalcGlobalOrientation 在选择的区域内计算整个运动方向,并且返回 0° 到 360°之间的角度值。首先函数创建运动直方图,寻找基本方向做为直方图最大值的坐标。然后函数计算与基本方向的相对偏移量,做为所有方向向量的加权和:运行越近,权重越大。得到的角度是基本方向和偏移量的循环和。

获得索引对象的矩形为感兴趣区域,返回角度,绘制圆形和方向线。