发明名称 一种基于凸包与OBB的三维网格模型骨架提取方法
摘要 本发明公开了一种利用凸包与OBB的三维网格模型骨架提取方法。本发明通过对三维网格模型进行分割,生成多个子网格模型,再通过对各子网格的点集求最小凸包,使用凸包顶点构造子网格的凸包近似,以及计算每个凸包点集的形心,构造原始骨架点,然后用OBB包围盒进行重叠计算,求出相交点集,生成关节骨架点,最终对原始骨架点与关节骨架点进行连接,最终形成完整骨架。本发明的优点是数据准确、操作方便,计算效率高等优点。本发明在计算机动画、物体识别和匹配、模型重建、虚拟导航等领域也有着重要的应用价值。
申请公布号 CN102254343B 申请公布日期 2013.01.30
申请号 CN201110179437.2 申请日期 2011.07.01
申请人 浙江理工大学 发明人 李重;林佼
分类号 G06T17/00(2006.01)I 主分类号 G06T17/00(2006.01)I
代理机构 浙江英普律师事务所 33238 代理人 陈小良
主权项 1.一种用于三维物体识别与匹配的基于凸包与OBB的人体三维网格模型骨架提取方法,其特征在于包括下述步骤:(1)网格分割对一整体网格模型,基于特征的区域生长算法对网格进行分割处理;首先输入一个三维网格模型,在三维网络模型上标注出前景曲线与背景曲线,然后计算从视点发出的射线通过前后背景曲线与网格的交点,定义为C={C<sub>F</sub>,C<sub>B</sub>},其中C<sub>F</sub>、C<sub>B</sub>分别为前景曲线与背景曲线的投影点集;再根据Isophotic度量距离进行区域增长;Isophotic度量考虑的因素有:曲面上边的长度、曲面法向量、曲率的度量;Isophotic度量的公式化离散形式表述为:<maths num="0001"><![CDATA[<math><mrow><msub><mi>d</mi><mi>&Gamma;</mi></msub><mrow><mo>(</mo><mi>p</mi><mo>,</mo><mi>q</mi><mo>)</mo></mrow><mo>=</mo><mo>|</mo><mi>p</mi><mo>-</mo><mi>q</mi><mo>|</mo><mo>+</mo><mi>&omega;</mi><mo>|</mo><msub><mi>n</mi><mi>p</mi></msub><mo>-</mo><msub><mi>n</mi><mi>q</mi></msub><mo>|</mo><mo>+</mo><msup><mi>&omega;</mi><mo>*</mo></msup><mi>f</mi><mrow><mo>(</mo><msub><mi>k</mi><mover><mi>pq</mi><mo>&OverBar;</mo></mover></msub><mo>)</mo></mrow><mo>,</mo></mrow></math>]]></maths>其中d<sub>Γ</sub>(p,q)为p,q两点的Isophotic度量距离;n<sub>p</sub>,n<sub>q</sub>分别为两点的法向量;<img file="FDA00002121607400012.GIF" wi="60" he="60" />为曲面沿线<img file="FDA00002121607400013.GIF" wi="64" he="61" />方向的曲率;ω、ω<sup>*</sup>为权重,设为5;f运算定义如下:<maths num="0002"><![CDATA[<math><mrow><mi>f</mi><mrow><mo>(</mo><msub><mi>k</mi><mi>D</mi></msub><mo>)</mo></mrow><mo>=</mo><mfenced open='{' close=''><mtable><mtr><mtd><msub><mi>k</mi><mi>D</mi></msub><mo>,</mo></mtd><mtd><msub><mi>k</mi><mi>D</mi></msub><mo>&GreaterEqual;</mo><mn>0</mn></mtd></mtr><mtr><mtd><msup><mi>e</mi><mrow><mo>|</mo><msub><mi>k</mi><mi>D</mi></msub><mo>|</mo></mrow></msup><mo>-</mo><mn>1</mn><mo>,</mo></mtd><mtd><msub><mi>k</mi><mi>D</mi></msub><mo>&lt;</mo><mn>0</mn></mtd></mtr></mtable></mfenced></mrow></math>]]></maths>以C<sub>F</sub>、C<sub>B</sub>为“种子点”,根据Isophotic度量应用区域生长策略,将全部网格顶点划分为两类,即前景点和背景点,也就将网格分为两部分;在边界处,应用基于蛇形曲线的最小化能量方法进行边界优化,最终生成所要的分割结果;(2)凸包近似对各子网格进行凸包近似处理:凸包是包含点集合S中所有对象的最小凸集,凸包的构造涉及到两个因素,即从点集S中筛选凸壳顶点以及建立各顶点之间的拓扑关系,采用改进的增量算法来构建三维凸包,具体如下:遍历点集S,取出x坐标最大与最小的两点,与y坐标最大和z坐标最大的点构建一初始四面体,然后将多面体的每个面的三个顶点均逆时针排列,然后每次从点集S中取出一个点,对该点进行可见性判断;若该点对于所有面都不可见,则该点位于凸包内,不做处理;若有可见面,则遍历棱边,若该棱边的两个邻接面均可见,则删除该棱边,若该棱边只有一个可见面,则用新加入的点与该棱边创建新面,并创建两条新边,最后删除所有可见面,这样依次加入新点,直至点集S为空;其中可见性判断用面法向量与待检测点到面上一端点向量的点积的正负号判断;(3)确定初始骨架接下来构造每个子网格的OBB:OBB是三维空间中的一个轴向任意的长方体包围盒;将三角形顶点集合看作是三变量的概率分布函数,在对OBB进行计算时,利用三角形顶点的均值和协方差矩阵来计算OBB的中心位置和轴向;设三角形集的第i个三角形的顶点矢量为p<sub>i</sub>,q<sub>i</sub>和r<sub>i</sub>,OBB包围的三角面片数,即凸壳面片数为n,则凸包顶点的均值为:<maths num="0003"><![CDATA[<math><mrow><msub><mi>C</mi><mi>m</mi></msub><mo>=</mo><mfrac><mn>1</mn><mrow><mn>3</mn><mi>n</mi></mrow></mfrac><munderover><mi>&Sigma;</mi><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><mrow><mo>(</mo><msub><mi>p</mi><mi>i</mi></msub><mo>+</mo><msub><mi>q</mi><mi>i</mi></msub><mo>+</mo><msub><mi>r</mi><mi>i</mi></msub><mo>)</mo></mrow><mo>.</mo></mrow></math>]]></maths>其协方差矩阵为:<maths num="0004"><![CDATA[<math><mrow><mi>D</mi><mo>=</mo><mfenced open='(' close=')'><mtable><mtr><mtd><munderover><mi>&Sigma;</mi><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><mrow><mo>(</mo><msubsup><mover><msub><mi>p</mi><mi>i</mi></msub><mo>&OverBar;</mo></mover><mi>x</mi><mn>2</mn></msubsup><mo>+</mo><msubsup><mover><msub><mi>q</mi><mi>i</mi></msub><mo>&OverBar;</mo></mover><mi>x</mi><mn>2</mn></msubsup><mo>+</mo><msubsup><mover><msub><mi>r</mi><mi>i</mi></msub><mo>&OverBar;</mo></mover><mi>x</mi><mn>2</mn></msubsup><mo>)</mo></mrow></mtd><mtd><munderover><mi>&Sigma;</mi><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><mrow><mo>(</mo><msub><mover><msub><mi>p</mi><mi>i</mi></msub><mo>&OverBar;</mo></mover><mi>x</mi></msub><msub><mover><msub><mi>p</mi><mi>i</mi></msub><mo>&OverBar;</mo></mover><mi>y</mi></msub><mo>+</mo><msub><mover><msub><mi>q</mi><mi>i</mi></msub><mo>&OverBar;</mo></mover><mi>x</mi></msub><msub><mover><msub><mi>q</mi><mi>i</mi></msub><mo>&OverBar;</mo></mover><mi>y</mi></msub><mo>+</mo><msub><mover><msub><mi>r</mi><mi>i</mi></msub><mo>&OverBar;</mo></mover><mi>x</mi></msub><msub><mover><msub><mi>r</mi><mi>i</mi></msub><mo>&OverBar;</mo></mover><mi>y</mi></msub><mo>)</mo></mrow></mtd><mtd><munderover><mi>&Sigma;</mi><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><mrow><mo>(</mo><msub><mover><msub><mi>p</mi><mi>i</mi></msub><mo>&OverBar;</mo></mover><mi>x</mi></msub><msub><mover><msub><mi>p</mi><mi>i</mi></msub><mo>&OverBar;</mo></mover><mi>z</mi></msub><mo>+</mo><msub><mover><msub><mi>q</mi><mi>i</mi></msub><mo>&OverBar;</mo></mover><mi>x</mi></msub><msub><mover><msub><mi>q</mi><mi>i</mi></msub><mo>&OverBar;</mo></mover><mi>z</mi></msub><mo>+</mo><msub><mover><msub><mi>r</mi><mi>i</mi></msub><mo>&OverBar;</mo></mover><mi>x</mi></msub><msub><mover><msub><mi>r</mi><mi>i</mi></msub><mo>&OverBar;</mo></mover><mi>z</mi></msub><mo>)</mo></mrow></mtd></mtr><mtr><mtd><munderover><mi>&Sigma;</mi><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><mrow><mo>(</mo><msub><mover><msub><mi>p</mi><mi>i</mi></msub><mo>&OverBar;</mo></mover><mi>x</mi></msub><msub><mover><msub><mi>p</mi><mi>i</mi></msub><mo>&OverBar;</mo></mover><mi>y</mi></msub><mo>+</mo><msub><mover><msub><mi>q</mi><mi>i</mi></msub><mo>&OverBar;</mo></mover><mi>x</mi></msub><msub><mover><msub><mi>q</mi><mi>i</mi></msub><mo>&OverBar;</mo></mover><mi>y</mi></msub><mo>+</mo><msub><mover><msub><mi>r</mi><mi>i</mi></msub><mo>&OverBar;</mo></mover><mi>x</mi></msub><msub><mover><msub><mi>r</mi><mi>i</mi></msub><mo>&OverBar;</mo></mover><mi>y</mi></msub><mo>)</mo></mrow></mtd><mtd><munderover><mi>&Sigma;</mi><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><mrow><mo>(</mo><msubsup><mover><msub><mi>p</mi><mi>i</mi></msub><mo>&OverBar;</mo></mover><mi>y</mi><mn>2</mn></msubsup><mo>+</mo><msubsup><mover><msub><mi>q</mi><mi>i</mi></msub><mo>&OverBar;</mo></mover><mi>y</mi><mn>2</mn></msubsup><mo>+</mo><msubsup><mover><msub><mi>r</mi><mi>i</mi></msub><mo>&OverBar;</mo></mover><mi>y</mi><mn>2</mn></msubsup><mo>)</mo></mrow></mtd><mtd><munderover><mi>&Sigma;</mi><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><mrow><mo>(</mo><msub><mover><msub><mi>p</mi><mi>i</mi></msub><mo>&OverBar;</mo></mover><mi>y</mi></msub><msub><mover><msub><mi>p</mi><mi>i</mi></msub><mo>&OverBar;</mo></mover><mi>z</mi></msub><mo>+</mo><msub><mover><msub><mi>q</mi><mi>i</mi></msub><mo>&OverBar;</mo></mover><mi>y</mi></msub><msub><mover><msub><mi>q</mi><mi>i</mi></msub><mo>&OverBar;</mo></mover><mi>z</mi></msub><mo>+</mo><msub><mover><msub><mi>r</mi><mi>i</mi></msub><mo>&OverBar;</mo></mover><mi>y</mi></msub><msub><mover><msub><mi>r</mi><mi>i</mi></msub><mo>&OverBar;</mo></mover><mi>z</mi></msub><mo>)</mo></mrow></mtd></mtr><mtr><mtd><munderover><mi>&Sigma;</mi><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><mrow><mo>(</mo><msub><mover><msub><mi>p</mi><mi>i</mi></msub><mo>&OverBar;</mo></mover><mi>x</mi></msub><msub><mover><msub><mi>p</mi><mi>i</mi></msub><mo>&OverBar;</mo></mover><mi>z</mi></msub><mo>+</mo><msub><mover><msub><mi>q</mi><mi>i</mi></msub><mo>&OverBar;</mo></mover><mi>x</mi></msub><msub><mover><msub><mi>q</mi><mi>i</mi></msub><mo>&OverBar;</mo></mover><mi>z</mi></msub><mo>+</mo><msub><mover><msub><mi>r</mi><mi>i</mi></msub><mo>&OverBar;</mo></mover><mi>x</mi></msub><msub><mover><msub><mi>r</mi><mi>i</mi></msub><mo>&OverBar;</mo></mover><mi>z</mi></msub><mo>)</mo></mrow></mtd><mtd><munderover><mi>&Sigma;</mi><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><mrow><mo>(</mo><msub><mover><msub><mi>p</mi><mi>i</mi></msub><mo>&OverBar;</mo></mover><mi>y</mi></msub><msub><mover><msub><mi>p</mi><mi>i</mi></msub><mo>&OverBar;</mo></mover><mi>z</mi></msub><mo>+</mo><msub><mover><msub><mi>q</mi><mi>i</mi></msub><mo>&OverBar;</mo></mover><mi>y</mi></msub><msub><mover><msub><mi>q</mi><mi>i</mi></msub><mo>&OverBar;</mo></mover><mi>z</mi></msub><mo>+</mo><msub><mover><msub><mi>r</mi><mi>i</mi></msub><mo>&OverBar;</mo></mover><mi>y</mi></msub><msub><mover><msub><mi>r</mi><mi>i</mi></msub><mo>&OverBar;</mo></mover><mi>z</mi></msub><mo>)</mo></mrow></mtd><mtd><munderover><mi>&Sigma;</mi><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><mrow><mo>(</mo><msubsup><mover><msub><mi>p</mi><mi>i</mi></msub><mo>&OverBar;</mo></mover><mi>z</mi><mn>2</mn></msubsup><mo>+</mo><msubsup><mover><msub><mi>q</mi><mi>i</mi></msub><mo>&OverBar;</mo></mover><mi>z</mi><mn>2</mn></msubsup><mo>+</mo><msubsup><mover><msub><mi>r</mi><mi>i</mi></msub><mo>&OverBar;</mo></mover><mi>z</mi><mn>2</mn></msubsup><mo>)</mo></mrow></mtd></mtr></mtable></mfenced><mo>,</mo></mrow></math>]]></maths>其中向量<img file="FDA00002121607400023.GIF" wi="258" he="71" />分别为<img file="FDA00002121607400024.GIF" wi="48" he="63" />的x,y,z分量,<img file="FDA00002121607400025.GIF" wi="263" he="63" />向量<img file="FDA00002121607400026.GIF" wi="238" he="71" />分别为<img file="FDA00002121607400027.GIF" wi="44" he="63" />的x,y,z分量,<img file="FDA00002121607400028.GIF" wi="266" he="63" />向量<img file="FDA00002121607400029.GIF" wi="208" he="71" />分别为<img file="FDA000021216074000210.GIF" wi="34" he="63" />的x,y,z分量,<maths num="0005"><![CDATA[<math><mrow><mover><msub><mi>r</mi><mi>i</mi></msub><mo>&OverBar;</mo></mover><mo>=</mo><msub><mi>r</mi><mi>i</mi></msub><mo>-</mo><msub><mi>C</mi><mi>m</mi></msub><mo>;</mo></mrow></math>]]></maths>协方差矩阵D是一个实对称矩阵,所以它的三个特征向量是正交的,正规化后可作为一个基底,这就确定了OBB的三个轴向,分别计算各个顶点在该基底的三个轴向上的最大值和最小值,以确定该OBB的大小;对各子网格求得到凸包顶点的OBB后,将各个均值C<sub>m</sub>作为初始骨架点,连接各相邻部分的初始骨架点,就得到了初始骨架;(4)生成完整骨架上述步骤中的初始骨架只是将各个OBB的中心点简单连接起来,若两部分的轴向成一定的角度,则连线就会远离中心位置,不满足中心性要求,需对初始骨架进行优化处理,增加一些重要关节骨架点;该处理过程分两步,首先确定两相邻子网格点集的OBB交集内所有点,然后再求取这些点的中心点作为关节骨架点,这样连接后就生成了完整骨架;(4.1)求取相邻OBB交集内的点集已知点集A的中心点C<sub>A</sub>、三个轴向单位向量A<sub>x</sub>,A<sub>y</sub>,A<sub>z</sub>和在三个轴向上的长度<img file="FDA00002121607400031.GIF" wi="915" he="61" />中心点C<sub>A</sub>到相邻点集B中的任意点<img file="FDA00002121607400032.GIF" wi="57" he="54" />的向量为<img file="FDA00002121607400033.GIF" wi="123" he="55" /><maths num="0006"><![CDATA[<math><mrow><msubsup><mover><mi>p</mi><mo>&OverBar;</mo></mover><mrow><mi>A</mi><mo>&RightArrow;</mo><mi>B</mi></mrow><mi>i</mi></msubsup><mo>=</mo><msubsup><mi>p</mi><mi>B</mi><mi>i</mi></msubsup><mo>-</mo><msub><mi>C</mi><mi>A</mi></msub></mrow></math>]]></maths>以轴向为A<sub>x</sub>,A<sub>y</sub>,A<sub>z</sub>,原点为C<sub>A</sub>,点<img file="FDA00002121607400035.GIF" wi="56" he="55" />在局部坐标系A中的坐标为:<maths num="0007"><![CDATA[<math><mfenced open='{' close=''><mtable><mtr><mtd><msub><msubsup><mi>p</mi><mi>B</mi><mi>i</mi></msubsup><mi>Ax</mi></msub><mo>=</mo><msubsup><mover><mi>p</mi><mo>&OverBar;</mo></mover><mrow><mi>A</mi><mo>&RightArrow;</mo><mi>B</mi></mrow><mi>i</mi></msubsup><mo>&CenterDot;</mo><msub><mi>A</mi><mi>x</mi></msub></mtd></mtr><mtr><mtd><msub><msubsup><mi>p</mi><mi>B</mi><mi>i</mi></msubsup><mi>Ay</mi></msub><mo>=</mo><msubsup><mover><mi>p</mi><mo>&OverBar;</mo></mover><mrow><mi>A</mi><mo>&RightArrow;</mo><mi>B</mi></mrow><mi>i</mi></msubsup><mo>&CenterDot;</mo><msub><mi>A</mi><mi>y</mi></msub></mtd></mtr><mtr><mtd><msub><msubsup><mi>p</mi><mi>B</mi><mi>i</mi></msubsup><mi>Az</mi></msub><mo>=</mo><msubsup><mover><mi>p</mi><mo>&OverBar;</mo></mover><mrow><mi>A</mi><mo>&RightArrow;</mo><mi>B</mi></mrow><mi>i</mi></msubsup><mo>&CenterDot;</mo><msub><mi>A</mi><mi>z</mi></msub></mtd></mtr></mtable></mfenced></math>]]></maths>其中<img file="FDA00002121607400037.GIF" wi="80" he="62" />为点<img file="FDA00002121607400038.GIF" wi="55" he="54" />在局部坐标系A中的A<sub>x</sub>轴向上的坐标;<img file="FDA00002121607400039.GIF" wi="74" he="64" />为点<img file="FDA000021216074000310.GIF" wi="56" he="54" />在局部坐标系A中的A<sub>y</sub>轴向上的坐标;<img file="FDA000021216074000311.GIF" wi="73" he="61" />为点<img file="FDA000021216074000312.GIF" wi="56" he="54" />在局部坐标系A中的A<sub>z</sub>轴向上的坐标;若满足以下不等式方程组<maths num="0008"><![CDATA[<math><mfenced open='{' close=''><mtable><mtr><mtd><msub><mrow><mo>-</mo><mi>d</mi></mrow><mrow><mo>(</mo><msub><mrow><mo>-</mo><mi>A</mi></mrow><mi>x</mi></msub><mo>)</mo></mrow></msub><mo>&le;</mo><msub><msubsup><mi>p</mi><mi>B</mi><mi>i</mi></msubsup><mi>Ax</mi></msub><mo>&le;</mo><msub><mi>d</mi><mrow><mo>(</mo><msub><mi>A</mi><mi>x</mi></msub><mo>)</mo></mrow></msub></mtd></mtr><mtr><mtd><msub><mrow><mo>-</mo><mi>d</mi></mrow><mrow><mo>(</mo><msub><mrow><mo>-</mo><mi>A</mi></mrow><mi>y</mi></msub><mo>)</mo></mrow></msub><mo>&le;</mo><msub><msubsup><mi>p</mi><mi>B</mi><mi>i</mi></msubsup><mi>Ay</mi></msub><mo>&le;</mo><msub><mi>d</mi><mrow><mo>(</mo><msub><mi>A</mi><mi>y</mi></msub><mo>)</mo></mrow></msub></mtd></mtr><mtr><mtd><msub><mrow><mo>-</mo><mi>d</mi></mrow><mrow><mo>(</mo><msub><mrow><mo>-</mo><mi>A</mi></mrow><mi>z</mi></msub><mo>)</mo></mrow></msub><mo>&le;</mo><msub><msubsup><mi>p</mi><mi>B</mi><mi>i</mi></msubsup><mi>Az</mi></msub><mo>&le;</mo><msub><mi>d</mi><mrow><mo>(</mo><msub><mi>A</mi><mi>z</mi></msub><mo>)</mo></mrow></msub></mtd></mtr></mtable></mfenced></math>]]></maths>则该点位于点集A的OBB内;依次对B内所有点进行判断,确定点集B内所有位于点集A的OBB内的点;然后反向操作,求出点集A内所有位于点集B的OBB内的点,两者的并集即为我们要求的OBB交集内所有点的集合;(4.2)确定关节点,生成骨架按上述步骤求出所有相邻OBB相交区域内的点集后,利用下式<img file="FDA00002121607400041.GIF" wi="263" he="127" />其中n为OBB交集内的点集总数,g<sub>i</sub>为该点集中的第i个点的坐标;来求取OBB交集内所有点的均值坐标,将之作为关节骨架点,并与两个相关联的骨架点相连接,从而形成完整的骨架。
地址 310018 浙江省杭州市江干区下沙高教园区