运动模板跟踪
2016-05-27 16:53
232 查看
一、概述
运动模板是一种有效的跟踪普遍运动方法,尤其可应用在姿势识别中。运用运动模板需要知道物体的轮廓。而轮廓的获取有一下几种方法:
(1)利用一个静止的摄像机,使用帧间差得到物体的运动边缘,这种信息就足够让运动模板发挥作用。
(2)利用颜色信息。
(3)学习一个背景模型,从此背景中可以将新的前景物体或人以轮廓的形式分割出来。
(4)使用主动轮廓技术。例如,创建一个红外光的墙,将能感应近红外线的摄像机对着墙,那么任何介于墙和摄像机之间的物体都会以轮廓的形式出现。
(5)使用感应图像。任何温度高的物体(如人脸)都可以被认为是前景。
(6)利用分割技术(例如金字塔分割或者mean-shift分割)来生成轮廓。
二、相关函数
1、去掉影像(silhouette) 以更新运动历史图像
void cvUpdateMotionHistory( const CvArr* silhouette, CvArr* mhi, double timestamp, double duration );
silhouette
影像 mask,运动发生地方具有非零象素
mhi
运动历史图像(单通道, 32-比特 浮点数),为本函数所更新
timestamp
当前时间,毫秒或其它单位
duration
运动跟踪的最大持续时间,用 timestamp 一样的时间单位
函数 cvUpdateMotionHistory 用下面方式更新运动历史图像:
mhi(x,y) = timestamp if silhouette(x,y) != 0
0 if silhouette(x,y) = 0 and mhi(x,y) < timestamp - duration
mhi(x,y) otherwise
也就是,MHI(motion history image)中在运动发生的象素点被设置为当前时间戳,而运动发生较久的象素点被清除。
2、计算运动历史图像的梯度方向
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 的描述).
3、计算某些选择区域的全局运动方向
double cvCalcGlobalOrientation( const CvArr* orientation, const CvArr* 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° 之间的角度值。首先函数创建运动直方图,寻找基本方向做为直方图最大值的坐标。然后函数计算与基本方向的相对偏移量,做为所有方向向量的加权和:运行越近,权重越大。得到的角度是基本方向和偏移量的循环和。
4、将整个运动分割为独立的运动部分
CvSeq* cvSegmentMotion( const CvArr* mhi, CvArr* seg_mask, CvMemStorage* storage,
double timestamp, double seg_thresh );
mhi
运动历史图像
seg_mask
发现应当存储的 mask 的图像, 单通道, 32bits, 浮点数.
storage
包含运动连通域序列的内存存储仓
timestamp
当前时间,毫秒单位
seg_thresh
分割阈值,推荐等于或大于运动历史“每步”之间的间隔。
函数 cvSegmentMotion 寻找所有的运动分割,并且在seg_mask 用不同的单独数字(1,2,...)标识它们。它也返回一个具有 CvConnectedComp 结构的序列,其中每个结构对应一个运动部件。在这之后,每个运动部件的运动方向就可以被函数 cvCalcGlobalOrientation 利用提取的特定部件的掩模(mask)计算出来(使用 cvCmp)
运动模板是一种有效的跟踪普遍运动方法,尤其可应用在姿势识别中。运用运动模板需要知道物体的轮廓。而轮廓的获取有一下几种方法:
(1)利用一个静止的摄像机,使用帧间差得到物体的运动边缘,这种信息就足够让运动模板发挥作用。
(2)利用颜色信息。
(3)学习一个背景模型,从此背景中可以将新的前景物体或人以轮廓的形式分割出来。
(4)使用主动轮廓技术。例如,创建一个红外光的墙,将能感应近红外线的摄像机对着墙,那么任何介于墙和摄像机之间的物体都会以轮廓的形式出现。
(5)使用感应图像。任何温度高的物体(如人脸)都可以被认为是前景。
(6)利用分割技术(例如金字塔分割或者mean-shift分割)来生成轮廓。
二、相关函数
1、去掉影像(silhouette) 以更新运动历史图像
void cvUpdateMotionHistory( const CvArr* silhouette, CvArr* mhi, double timestamp, double duration );
silhouette
影像 mask,运动发生地方具有非零象素
mhi
运动历史图像(单通道, 32-比特 浮点数),为本函数所更新
timestamp
当前时间,毫秒或其它单位
duration
运动跟踪的最大持续时间,用 timestamp 一样的时间单位
函数 cvUpdateMotionHistory 用下面方式更新运动历史图像:
mhi(x,y) = timestamp if silhouette(x,y) != 0
0 if silhouette(x,y) = 0 and mhi(x,y) < timestamp - duration
mhi(x,y) otherwise
也就是,MHI(motion history image)中在运动发生的象素点被设置为当前时间戳,而运动发生较久的象素点被清除。
2、计算运动历史图像的梯度方向
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 的描述).
3、计算某些选择区域的全局运动方向
double cvCalcGlobalOrientation( const CvArr* orientation, const CvArr* 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° 之间的角度值。首先函数创建运动直方图,寻找基本方向做为直方图最大值的坐标。然后函数计算与基本方向的相对偏移量,做为所有方向向量的加权和:运行越近,权重越大。得到的角度是基本方向和偏移量的循环和。
4、将整个运动分割为独立的运动部分
CvSeq* cvSegmentMotion( const CvArr* mhi, CvArr* seg_mask, CvMemStorage* storage,
double timestamp, double seg_thresh );
mhi
运动历史图像
seg_mask
发现应当存储的 mask 的图像, 单通道, 32bits, 浮点数.
storage
包含运动连通域序列的内存存储仓
timestamp
当前时间,毫秒单位
seg_thresh
分割阈值,推荐等于或大于运动历史“每步”之间的间隔。
函数 cvSegmentMotion 寻找所有的运动分割,并且在seg_mask 用不同的单独数字(1,2,...)标识它们。它也返回一个具有 CvConnectedComp 结构的序列,其中每个结构对应一个运动部件。在这之后,每个运动部件的运动方向就可以被函数 cvCalcGlobalOrientation 利用提取的特定部件的掩模(mask)计算出来(使用 cvCmp)
相关文章推荐
- Android实现应用下载并自动安装apk包
- vsftp搭配iptables的配置
- 图片服务器跨域的问题
- 团队作业六
- 剑指Offer:树的子结构
- 程序员职业素养笔记
- CSS隐藏文字以及以图代字( text-indent: 100%;)
- Android Studio之常用设置
- 表示和描述(3)
- 总结几点Quartz的经验
- java多线程---顺序打印ABC的三种实现---synchronized方式
- Android中如何通过程序打开或关闭GPS
- MongoDB的主从复制与复制集
- MFC编辑框“请输入一个整数”,数字后面自动跟了一个0
- power_supply子系统笔记
- 【Moqui业务逻辑翻译系列】Shipment Receiver Receives Shipment with Packing Slip but no PO
- Android 自定义View属性相关细节
- lintcode ----二叉树的最小深度
- UCloud可用区的设计理念及功能图文详解
- 计划进度表