发明名称 三维人体运动数据关键帧提取方法
摘要 本发明公开了一种对人体运动数据自动提取关键帧的方法。在数据表示上采用人体四肢骨骼与中心骨骼夹角作为运动特征并以此来表征三维人体运动数据,然后根据骨骼夹角的运动轨迹确定运动时可能存在的“边界”姿势作为候选关键帧集合,最后采用分层曲线简化算法精选候关键帧获得最终关键帧集合。同时,本发明还提出一种自适应误差参数调整方法以满足不同压缩率要求。使用该方法对人体运动数据具有良好的关键帧提取、压缩效果,以及较强的运动概括能力,并在一定程度上保证了同类运动关键帧集合之间的一致性。
申请公布号 CN100403313C 申请公布日期 2008.07.16
申请号 CN200610053399.5 申请日期 2006.09.14
申请人 浙江大学 发明人 庄越挺;肖俊;吴飞;杨涛
分类号 G06F17/30(2006.01);G06T7/00(2006.01) 主分类号 G06F17/30(2006.01)
代理机构 杭州求是专利事务所有限公司 代理人 张法高
主权项 1.一种三维人体运动数据关键帧提取方法,其特征在于包括以下步骤:(1)首先采用骨骼夹角作为三维人体运动数据序列的特征表示;(2)基于骨骼夹角特征从三维人体运动数据序列中提取候选关键帧集合;(3)以三维人体运动数据的骨骼夹角特征序列、候选关键帧集合及误差参数为输入,采用分层曲线简化算法提取最终关键帧集合;(4)基于用户输入的关键帧数目及分层曲线简化算法返回的实际关键帧数目,误差参数自适应调节方法能够不断反馈正确的误差参数,以便于获取最终的满足用户要求的关键帧数量;所述采用骨骼夹角作为三维人体运动数据序列的特征表示是将人体骨架中四肢部分的八段骨骼作为特征表示对象,提取这八段骨骼与由根关节和胸关节组成的中心骨骼之间的夹角作为运动特征,定义段骨骼<img file="C2006100533990002C1.GIF" wi="87" he="58" />为由该段骨骼中位于人体骨架较高层关节N<sub>i</sub>指向较低层关节N<sub>j</sub>的向量,即:<maths num="0001"><![CDATA[<math><mrow><msup><mover><mi>B</mi><mo>&RightArrow;</mo></mover><mrow><mo>(</mo><mi>k</mi><mo>)</mo></mrow></msup><mo>=</mo><mover><mrow><msub><mi>N</mi><mi>i</mi></msub><msub><mi>N</mi><mi>j</mi></msub></mrow><mo>&RightArrow;</mo></mover><mo>=</mo><mrow><mo>(</mo><msup><mover><mi>p</mi><mo>&RightArrow;</mo></mover><mrow><mo>(</mo><mi>j</mi><mo>)</mo></mrow></msup><mo>-</mo><msup><mover><mi>p</mi><mo>&RightArrow;</mo></mover><mrow><mo>(</mo><mi>i</mi><mo>)</mo></mrow></msup><mo>)</mo></mrow><mo>,</mo></mrow></math>]]></maths>其中,<img file="C2006100533990002C3.GIF" wi="152" he="52" />是关节N<sub>i</sub>和N<sub>j</sub>在三维空间中的坐标,因此,在给定帧时刻i,任意段四肢骨骼与中心骨骼夹角的公式计算为:<maths num="0002"><![CDATA[<math><mrow><msubsup><mi>&theta;</mi><mi>i</mi><mi>k</mi></msubsup><mo>=</mo><msup><mi>cos</mi><mrow><mo>-</mo><mn>1</mn></mrow></msup><mrow><mo>(</mo><mfrac><mrow><msubsup><mover><mi>B</mi><mo>&OverBar;</mo></mover><mi>i</mi><mi>k</mi></msubsup><mo>&CenterDot;</mo><msubsup><mover><mi>B</mi><mo>&OverBar;</mo></mover><mi>i</mi><mrow><mo>(</mo><mi>center</mi><mo>)</mo></mrow></msubsup></mrow><mrow><mo>|</mo><msubsup><mover><mi>B</mi><mo>&OverBar;</mo></mover><mi>i</mi><mi>k</mi></msubsup><mo>|</mo><mo>|</mo><msubsup><mover><mi>B</mi><mo>&OverBar;</mo></mover><mi>i</mi><mrow><mo>(</mo><mi>center</mi><mo>)</mo></mrow></msubsup><mo>|</mo></mrow></mfrac><mo>)</mo></mrow><mo>,</mo><mi>k</mi><mo>=</mo><mn>1</mn><mo>,</mo><mo>.</mo><mo>.</mo><mo>.</mo><mo>,</mo><mn>8</mn></mrow></math>]]></maths>其中,<img file="C2006100533990002C5.GIF" wi="128" he="59" />表示中心骨骼,θ的取值范围为[0,π],这样,对于任意帧时刻i,采用上述运动特征表示法,人体姿势可以表示为八元组:<maths num="0003"><![CDATA[<math><mrow><msub><mi>F</mi><mi>i</mi></msub><mo>=</mo><mrow><mo>(</mo><msubsup><mi>&theta;</mi><mi>i</mi><mrow><mo>(</mo><mn>1</mn><mo>)</mo></mrow></msubsup><mo>,</mo><mo>.</mo><mo>.</mo><mo>.</mo><mo>,</mo><msubsup><mi>&theta;</mi><mi>i</mi><mrow><mo>(</mo><mn>8</mn><mo>)</mo></mrow></msubsup><mo>)</mo></mrow><mo>,</mo></mrow></math>]]></maths>不仅实现原始运动捕获数据的高维降维,而且有效反映了运动的物理含义;所述基于骨骼夹角特征从三维人体运动数据序列中提取候选关键帧集合是指人体骨架四肢中各自两段骨骼与中心骨骼的夹角变化情况共同反映了人体的运动情况,综合人体所有四肢骨骼夹角变化情况,取它们的极值所在帧的并集,可以得到候选关键帧集合;所述采用分层曲线简化算法提取最终关键帧集合是指给定一个有序数据集M,<maths num="0004"><![CDATA[<math><mrow><mi>M</mi><mo>=</mo><mo>{</mo><msub><mi>F</mi><mi>i</mi></msub><mo>|</mo><mi>i</mi><mo>=</mo><mn>1</mn><mo>,</mo><mo>.</mo><mo>.</mo><mo>.</mo><mo>,</mo><mi>N</mi><mo>}</mo><mo>,</mo><msub><mi>F</mi><mi>i</mi></msub><mo>=</mo><mrow><mo>(</mo><msubsup><mi>x</mi><mi>i</mi><mrow><mo>(</mo><mn>1</mn><mo>)</mo></mrow></msubsup><mo>,</mo><mo>.</mo><mo>.</mo><mo>.</mo><mo>,</mo><msubsup><mi>x</mi><mi>i</mi><mrow><mo>(</mo><mi>m</mi><mo>)</mo></mrow></msubsup><mo>)</mo></mrow><mo>,</mo></mrow></math>]]></maths>按序连接M中所有数据点,形成一个m维空间中的曲线,求满足一定误差要求的M的真子集K逼近曲线M,同时,K中的元素应尽可能多地属于集合<maths num="0005"><![CDATA[<math><mrow><mi>C</mi><mo>:</mo><mi>C</mi><mo>&Subset;</mo><mi>M</mi></mrow></math>]]></maths>且F<sub>1</sub>,F<sub>N</sub>∈C,为了解决这个问题,将M用一个两层的数据结构来表示,下层为M,上层为M的真子集C,首先在上层运用单层曲线简化算法,若简化结果未能满足误差要求,降到下层运用单层曲线简化算法,并把得到的分裂点加入到上层中,继续在上层进行曲线简化,如此反复,直到求得满足条件的集合K,在这个方法中,c_num和pair两个数组被分别使用,数组c_num记录集合C中元素在M中的位置,按元素位置从小到大的顺序排序,数组pair标记M中元素是否属于集合K,若不属于,pair值为0,若属于,pair值指向K中下一个元素在M中的位置,在单层曲线简化算法中,计算集合M中第i个元素到由第n<sub>1</sub>个元素和第n<sub>2</sub>个元素(n<sub>1</sub><i<n<sub>2</sub>)连成的直线的最短距离,可以由以下公式得到:<maths num="0006"><![CDATA[<math><mrow><msub><mi>d</mi><mi>i</mi></msub><mo>=</mo><msqrt><munderover><mi>&Sigma;</mi><mrow><mi>k</mi><mo>=</mo><mn>1</mn></mrow><mi>m</mi></munderover><msup><mrow><mo>(</mo><msubsup><mi>x</mi><mi>i</mi><mrow><mo>(</mo><mi>k</mi><mo>)</mo></mrow></msubsup><mo>-</mo><msubsup><mi>x</mi><msub><mi>n</mi><mn>1</mn></msub><mrow><mo>(</mo><mi>k</mi><mo>)</mo></mrow></msubsup><mo>)</mo></mrow><mn>2</mn></msup><mo>-</mo><mfrac><msup><mrow><mo>(</mo><munderover><mi>&Sigma;</mi><mrow><mi>k</mi><mo>=</mo><mn>1</mn></mrow><mi>m</mi></munderover><mrow><mo>(</mo><msubsup><mi>x</mi><msub><mi>n</mi><mn>2</mn></msub><mrow><mo>(</mo><mi>k</mi><mo>)</mo></mrow></msubsup><mo>-</mo><msubsup><mi>x</mi><msub><mi>n</mi><mn>1</mn></msub><mrow><mo>(</mo><mi>k</mi><mo>)</mo></mrow></msubsup><mo>)</mo></mrow><mrow><mo>(</mo><msubsup><mi>x</mi><mi>i</mi><mrow><mo>(</mo><mi>k</mi><mo>)</mo></mrow></msubsup><mo>-</mo><msubsup><mi>x</mi><msub><mi>n</mi><mn>1</mn></msub><mrow><mo>(</mo><mi>k</mi><mo>)</mo></mrow></msubsup><mo>)</mo></mrow><mo>)</mo></mrow><mn>2</mn></msup><mrow><munderover><mi>&Sigma;</mi><mrow><mi>k</mi><mo>=</mo><mn>1</mn></mrow><mi>m</mi></munderover><msubsup><mi>x</mi><msub><mi>n</mi><mn>2</mn></msub><mrow><mo>(</mo><mi>k</mi><mo>)</mo></mrow></msubsup><mo>-</mo><msubsup><mi>x</mi><msub><mi>n</mi><mn>1</mn></msub><mrow><mo>(</mo><mi>k</mi><mo>)</mo></mrow></msubsup><msup><mo>)</mo><mn>2</mn></msup></mrow></mfrac></msqrt></mrow></math>]]></maths>分层曲线简化算法步骤如下:输入:数据集M,<maths num="0007"><![CDATA[<math><mrow><mi>M</mi><mo>=</mo><mo>{</mo><msub><mi>F</mi><mi>i</mi></msub><mo>|</mo><mi>i</mi><mo>=</mo><mn>1</mn><mo>,</mo><mo>.</mo><mo>.</mo><mo>.</mo><mo>,</mo><mi>N</mi><mo>}</mo><mo>,</mo><msub><mi>F</mi><mi>i</mi></msub><mo>=</mo><mrow><mo>(</mo><msubsup><mi>x</mi><mi>i</mi><mrow><mo>(</mo><mn>1</mn><mo>)</mo></mrow></msubsup><mo>,</mo><mo>.</mo><mo>.</mo><mo>.</mo><mo>,</mo><msubsup><mi>x</mi><mi>i</mi><mrow><mo>(</mo><mi>m</mi><mo>)</mo></mrow></msubsup><mo>)</mo></mrow><mo>;</mo></mrow></math>]]></maths>集合<maths num="0008"><![CDATA[<math><mrow><mi>C</mi><mo>:</mo><mi>C</mi><mo>&Subset;</mo><mi>M</mi></mrow></math>]]></maths>且F<sub>1</sub>,F<sub>N</sub>∈C;误差参数δ∈R<sup>+</sup>;输出:数组kfSet,kfSet={i|F<sub>i</sub>∈M &amp; F<sub>i</sub>∈K,i=1,..,N};步骤1:初始化,n为集合C的元素个数,c_num={i|F<sub>i</sub>∈M &amp; F<sub>i</sub>∈C,1≤i≤N},pair(1)=N,pair(N)=1,trackMark=1,标记当前处理到的C中元素的位置,lastMark=0,标记上一次处理到的C中元素的位置;步骤2:若pair(trackMark)=1,转步骤5,否则计算集合C中在元素trackMark和pair(trackMark)之间的子集subSet={c_num(i)|trackMark<c_num(i)<pair(trackMark),1≤i≤n},若subSet长度大于0,转步骤3,否则,转步骤4;步骤3:上层曲线简化(1)按公式<maths num="0009"><![CDATA[<math><mrow><msub><mi>d</mi><mi>i</mi></msub><mo>=</mo><msqrt><munderover><mi>&Sigma;</mi><mrow><mi>k</mi><mo>=</mo><mn>1</mn></mrow><mi>m</mi></munderover><msup><mrow><mo>(</mo><msubsup><mi>x</mi><mi>i</mi><mrow><mo>(</mo><mi>k</mi><mo>)</mo></mrow></msubsup><mo>-</mo><msubsup><mi>x</mi><msub><mi>n</mi><mn>1</mn></msub><mrow><mo>(</mo><mi>k</mi><mo>)</mo></mrow></msubsup><mo>)</mo></mrow><mn>2</mn></msup><mo>-</mo><mfrac><msup><mrow><mo>(</mo><munderover><mi>&Sigma;</mi><mrow><mi>k</mi><mo>=</mo><mn>1</mn></mrow><mi>m</mi></munderover><mrow><mo>(</mo><msubsup><mi>x</mi><msub><mi>n</mi><mn>2</mn></msub><mrow><mo>(</mo><mi>k</mi><mo>)</mo></mrow></msubsup><mo>-</mo><msubsup><mi>x</mi><msub><mi>n</mi><mn>1</mn></msub><mrow><mo>(</mo><mi>k</mi><mo>)</mo></mrow></msubsup><mo>)</mo></mrow><mrow><mo>(</mo><msubsup><mi>x</mi><mi>i</mi><mrow><mo>(</mo><mi>k</mi><mo>)</mo></mrow></msubsup><mo>-</mo><msubsup><mi>x</mi><msub><mi>n</mi><mn>1</mn></msub><mrow><mo>(</mo><mi>k</mi><mo>)</mo></mrow></msubsup><mo>)</mo></mrow><mo>)</mo></mrow><mn>2</mn></msup><mrow><munderover><mi>&Sigma;</mi><mrow><mi>k</mi><mo>=</mo><mn>1</mn></mrow><mi>m</mi></munderover><msubsup><mi>x</mi><msub><mi>n</mi><mn>2</mn></msub><mrow><mo>(</mo><mi>k</mi><mo>)</mo></mrow></msubsup><mo>-</mo><msubsup><mi>x</mi><msub><mi>n</mi><mn>1</mn></msub><mrow><mo>(</mo><mi>k</mi><mo>)</mo></mrow></msubsup><msup><mo>)</mo><mn>2</mn></msup></mrow></mfrac></msqrt></mrow></math>]]></maths>计算subSet中每一点到直线|F<sub>pair(trackMark)</sub>F<sub>trackMark</sub>|的距离,记最大距离为max_dist,其对应的元素为max_ind;(2)计算ratio=max_dist/‖F<sub>pair(trackMark)</sub>-F<sub>trackMark</sub>‖,若ratio>δ,令pair(max_ind)=pair(trackMark),pair(trackMark)=max_ind,否则trackMark=pair(trackMark);(3)转步骤2;步骤4:下层曲线简化(1)令subSet=[trackMark:pair(trackMark)];(2)按公式<maths num="0010"><![CDATA[<math><mrow><msub><mi>d</mi><mi>i</mi></msub><mo>=</mo><msqrt><munderover><mi>&Sigma;</mi><mrow><mi>k</mi><mo>=</mo><mn>1</mn></mrow><mi>m</mi></munderover><msup><mrow><mo>(</mo><msubsup><mi>x</mi><mi>i</mi><mrow><mo>(</mo><mi>k</mi><mo>)</mo></mrow></msubsup><mo>-</mo><msubsup><mi>x</mi><msub><mi>n</mi><mn>1</mn></msub><mrow><mo>(</mo><mi>k</mi><mo>)</mo></mrow></msubsup><mo>)</mo></mrow><mn>2</mn></msup><mo>-</mo><mfrac><msup><mrow><mo>(</mo><munderover><mi>&Sigma;</mi><mrow><mi>k</mi><mo>=</mo><mn>1</mn></mrow><mi>m</mi></munderover><mrow><mo>(</mo><msubsup><mi>x</mi><msub><mi>n</mi><mn>2</mn></msub><mrow><mo>(</mo><mi>k</mi><mo>)</mo></mrow></msubsup><mo>-</mo><msubsup><mi>x</mi><msub><mi>n</mi><mn>1</mn></msub><mrow><mo>(</mo><mi>k</mi><mo>)</mo></mrow></msubsup><mo>)</mo></mrow><mrow><mo>(</mo><msubsup><mi>x</mi><mi>i</mi><mrow><mo>(</mo><mi>k</mi><mo>)</mo></mrow></msubsup><mo>-</mo><msubsup><mi>x</mi><msub><mi>n</mi><mn>1</mn></msub><mrow><mo>(</mo><mi>k</mi><mo>)</mo></mrow></msubsup><mo>)</mo></mrow><mo>)</mo></mrow><mn>2</mn></msup><mrow><munderover><mi>&Sigma;</mi><mrow><mi>k</mi><mo>=</mo><mn>1</mn></mrow><mi>m</mi></munderover><msubsup><mi>x</mi><msub><mi>n</mi><mn>2</mn></msub><mrow><mo>(</mo><mi>k</mi><mo>)</mo></mrow></msubsup><mo>-</mo><msubsup><mi>x</mi><msub><mi>n</mi><mn>1</mn></msub><mrow><mo>(</mo><mi>k</mi><mo>)</mo></mrow></msubsup><msup><mo>)</mo><mn>2</mn></msup></mrow></mfrac></msqrt></mrow></math>]]></maths>计算subSet中每一点到直线|F<sub>pair(trackMark)</sub>F<sub>trackMark</sub>|的距离,记最大距离为max_dist,其对应的元素为max_ind;(3)计算ratio=max_dist/‖F<sub>pair(trackMark)</sub>-F<sub>trackMark</sub>‖,若ratio>δ,C=C∪{F<sub>max_ind</sub>},重置c_num和n,令pair(max_ind)=pair(trackMark),pair(trackMark)=max_ind,转步骤2,否则trackMark=pair(trackMark);(4)转步骤2;步骤5:kfSet={i|pair(i)≠0,1≤i≤N};所述误差参数自适应调节方法是指根据关键帧数目的实际值与目标值之差动态调节误差参数δ,若关键帧数目的实际值大于目标值,δ增加,增加比率为δ_inc(δ_inc∈(0,1)),若关键帧数目的实际值小于目标值,δ减小,减小比率为δ_dec(δ_dec∈(0,1)),进一步,对δ的增减率dδ(dδ∈{δ_inc,δ_des},dδ∈(0,1))采用动态调节的略策,若连续两次循环中关键帧数目当前值在目标值的同一侧,则增加dδ,以加快δ向同方向变化,否则,即是关键帧数目的实际值在目标值左右邻域进行振荡,此时应减小dδ,以减小振荡的幅度,dδ的增减变化函数分别为:<maths num="0011"><![CDATA[<math><mrow><msub><mi>f</mi><mi>inc</mi></msub><mrow><mo>(</mo><mi>d&delta;</mi><mo>)</mo></mrow><mo>=</mo><msqrt><mn>1</mn><mo>-</mo><msup><mrow><mo>(</mo><mi>d&delta;</mi><mo>-</mo><mn>1</mn><mo>)</mo></mrow><mn>2</mn></msup></msqrt><mo>,</mo></mrow></math>]]></maths><maths num="0012"><![CDATA[<math><mrow><msub><mi>f</mi><mi>dec</mi></msub><mrow><mo>(</mo><mi>d&delta;</mi><mo>)</mo></mrow><mo>=</mo><mn>1</mn><mo>-</mo><msqrt><mn>1</mn><mo>-</mo><msup><mi>d&delta;</mi><mn>2</mn></msup></msqrt><mo>,</mo></mrow></math>]]></maths>为振荡次数给定最大阈值epoch,将其作为算法中循环结束的一个条件。
地址 310027浙江省杭州市浙大路38号