关于c++:网格拟合

44次阅读

共计 3627 个字符,预计需要花费 10 分钟才能阅读完成。

这里的网格拟合,当然是三维网格拟合。

三维网格拟合有什么用?呃 ….. 当前再说吧 ……

什么是网格拟合

嗯,常常常常听到 [拟合] 这个名词,它示意一个动作。最常听到的是 最小二乘拟合 — 把一系列点 拟合 出一条线 — 把三维空间散乱点 拟合 出一个立体、球面、柱面 …

拟合 ,总须要一个 拟合源 ,总要有一个 指标。下面场景中,拟合源个别是二维或者三维的点数据,指标个别是线、立体、球面或者柱面等等的数学参数示意。

OK,大略曾经晓得拟合是做什么的了。那咱们的三维网格拟合,又是怎么回事呢?

其实,三维网格的拟合 和上述所谓拟合并没有本质区别,只是数据源和拟合指标都是可任意的三维网格数据而已,将两个三维网格拟合,其后果依然是一个三维网格,只不过拟合后的后果网格可能带有源数据和指标数据的局部显著特色。用公式示意就是:

Mesh A + Mesh B = Mesh C,其中“+”示意拟合计算

留神:上述所谓三维网格的拟合,并不蕴含网格带纹理的状况。即纹理不参加拟合运算。

说白了,所谓三维网格的拟合,其实就是多个三维网格通过肯定的‘’修修剪剪‘’产生一个新网格的过程,新网格就是拟合的后果。

怎么进行网格拟合

哦,我曾经晓得了什么是网格拟合,但怎么进行网格拟合计算呢。

如果,我有 A 和 B 两个三维网格数据,网格 A 有 10w 点,30w 三角面片,网格 B 有 7w 点,20w 三角面片,额 (⊙﹏⊙)…. 它俩应该怎么进行拟合计算呢?— 我应别离取 A 或 B 的哪一部分加入计算呢?A 和 B 不在同一个坐标系下怎么办呢?我的拟合运算会不会扭转 A 或者 B 的三角网格顶点之间的连贯关系呢?A 和 B 体积相差太大(比方一只狗和一只猫) 怎么办呢?须要缩放吗?缩放系数怎么解决呢?拟合品质如何评估呢?…… 呃呃 … 头好大 ….

既然头好大,那就规定非凡场景吧。

场景

还是来拿手头的人头网格说事。首先,人头点云,隐含了点云的体积头差不多(小孩子除外);其次,同一个扫描设施获取的三维人头网格数据量不会差异太大(其实这个条件没啥影响);最初,就是 … 我手头只有三维人头数据能够测试(么有去找更多的)。

有上面两组数据,其中上边的图像记为 Mesh A,下边的记为 Mesh B,

Mesh A:只有实在人脸局部,网格和顶点数量较多,三角网格之间并不是很“顺滑”;Mesh B:虚构全人头网格,网格数目和顶点数绝对 A 来说较少,且 mesh 表面光顺性较好。

指标,将 A 和 B 拟合,结构带有实在人脸网格模型的三维人头(理论利用中是有重要意义的)。

简略拟合

至此,可能很多很多敌人,曾经想到了一种非常简单的网格拟合办法。怎么做呢?

首先,将 Mesh A 和 Mesh B初步对齐,行将两个网格人脸局部对齐,放在同一个坐标系下。如何对齐呢?很简略,因为 Mesh A 和 Mesh B 都示意人脸网格,则其面部必有独特特色 — 眼睛、鼻子、嘴巴、鼻梁、眉毛 ….. 通过选两组 Mesh 中对应的特色点,基于指定的准确的对应点对,通过 ICP 计算,即可取得某 Mesh 的变换矩阵,从而使得两个 Mesh 对立到对立坐标系下。示意图如下:

其次,在实现上述初步对齐 – 即两个模型的眼睛对眼睛、鼻尖对鼻尖 … 后,咱们只有扭转 Mesh B 的面部网格构造形态即可。通过设定脸部间隔阈值,在保障 Mesh B 各个顶点链接关系不变的条件下(即不扭转拓扑关系),扭转 Mesh B 的脸部特色点的网格顶点坐标,使得 Mesh B 脸部出现 Mesh A 的外观特色,即实现了两个网格的拟合。

如何实现上述计算呢?最简略的 — 置换或者说替换。通过设定的间隔阈值,找到 Mesh B 和 Mesh A 的脸部对应点对,将两个 Mesh 的对应点对的坐标间接进行替换,同时保障 Mesh B 中点的链接关系不变(若该边,可能“脸就不是脸了”)。如下图:

能够看到,基于 【简略拟合】 实践,根本能够两个网格的拟合,并能根本失去本人想要的后果 — 含有实在人脸形态的全人头网格模型。

这就够了吗?

危险

显然不够!其实,上边的 【简略拟合】 存在较大的危险,其后果根本无奈利用在理论生产我的项目中。

危险点 1:品质较差。以上述形式拟合网格模型,如上图边界局部所示,拟合后果存在较大的突起,有十分突兀的形态变动。

危险点 2:精度无奈保障。其实上述形式中,只是简略的对应点的顶点替换,这就导致了在替换时,各个参加计算的点没有思考其邻域点的散布状况。计算过程中,极大概率导致某个特色点的坐标屡次变换,而且该特色点的坐标只与最初一次变动 (最初一个对应点) 无关 — 因为,Mesh B 和 Mesh A 的点数、网格数目及点密度都不一样,当将两个网格拟合计算时,必然存在一对多或者多对一的状况。

危险点 3:尺寸差异较大。这个问题应该怎么看待呢?!理论中,相对没有两个一摸一样的人,那么尺寸必然存在肯定误差。那咱们只能尽可能的缩小这种网格尺寸上的误差,可见,在下面计算中,没有思考这一点。

……

当然,还有其余很多的危险点,本人也无奈一一穷举。总之,上述形容计划兴许会是一种网格拟合的解决方案,然而对网格的后处理工作减少了许多的难度,须要更进一步的钻研与改良。

……

有没有其余方法呢?

实现

有!先上一篇论文《Review of Statistical Shape Spaces for 3D Data with Comparative Analysis for Human Faces》.

其实,其余计划的网格拟合 (如论文) 和上述 < 怎么进行网格拟合 > 大方向上基本一致:初步对齐 –> 更新顶点 –> 扭转网格形态,只不过须要在拟合过程中将上述几个危险点思考进去。

基于上述根本了解以及对所提到论文的浅见,设计并实现了如下网格拟合计划:

首先,初步对齐同 < 怎么进行网格拟合 > 所述统一;

其次,别离统计两个 Mesh 中特色点之间的欧式间隔之和,定义:若两个间隔之比靠近 1.0,则认为两个 Mesh 尺寸靠近,若大于 1.2 或者小于 0.8,怎认为尺寸差别较大,则对较小间隔和的 Mesh 进行适当缩放,直至从新计算的比值靠近 1.0 (针对危险 3);

第三,别离计算两个 Mesh 网格各个顶点法向量,设置对应点对角度阈值和间隔阈值,对应点对采纳如下形式计算:(1)从 Mesh A 中取特色点 f;(2)在 Mesh B 中寻找间隔 f 最近的三角面片 T;(3)计算 f 到 T 的垂足,则该垂足即为与 f 对应的特色点;若该对应点对满足设置的角度阈值和间隔阈值,怎认为该点对满足计算条件;

第四,基于特色点邻域信息,计算 Mesh A 中每个特色点的 3 * 4 变换矩阵,该变换矩阵使得特色点基于部分形态向 Mesh B 的对应点逐渐变换,其中,变换矩阵采纳 L –BFGS 算法(对于如何结构 LBFGS 求解函数,可能还须要另外大幅篇幅介绍,且本人也并不是很精通,故此舍去相干介绍,待前期补充吧)。并设置 Lbfgs 算法求解参数:迭代次数、梯度容差、代价函数、前后两次误差变换阈值、近邻点计算权重等。

第五、设置总体迭代次数。

基于上述大体思路,取得到后果如下所示:

可见,根本不存在上图中的问题。

小结

三维网格拟合是三维运算的一种,能够产生新的本人所须要的网格。

在我的场景中,有一个人脸模型和一个全人头模型,我想取得一个带有实在 (扫描仪获取) 人脸的全人头三维网格,通过网格拟合的模式,取得了我想要的后果。

其实当初回头来看,这不仅仅是网格的拟合问题,【实现】中步骤算法还能更进一步的扩大到用于解决非刚性配准问题。因为在上述求解计划中,基于特色点及其邻域点集,为每一个特色点都计算了一个 3 * 4 的仿射变换矩阵,该矩阵在部分上可能使得点以线性的形式逐渐靠近指标点,从全局来看更加安稳和润滑。实质上点云或网格的非刚性配准也是如此,同时非刚性配准又有很多很多理论利用 …

那三角网格拟合到底有啥用呢?比方:能够用来解决网格大面积缺失修复问题;能够用来产生新的有意思的网格,如蛇头换狗脸 ….; 能够用来解决人头补全问题;更进一步的可是用来实现虚构整容与预览等医美方面,可能为不同人脸虚构定制、预览不同发型;能够用来解决牙齿建模问题 ….

在这里,【实现】步骤中,并没有具体介绍如何进行拟合计算的细节,同时也并没有贴相干代码,因为这须要更大的篇幅,也须要更多更深刻的了解和公式推理。

在本片文章介绍中,其实还剩去了十分重要或着说十分有必要的一个步骤:纹理贴图。因为在很多很多场景中,网格和纹理是密不可分的 – 如医美。在进行三角网格拟合变换后,再应用原来的纹理图其实曾经没有太大意义,其一:网格点坐标曾经变换,根本不适用于原来的纹理坐标,会产生重大的纹理变形,视觉效果十分差;其二:网格拟合的目标就在于获取新的模型,那么再贴原来的纹理图又有什么意义呢。

对于网格拟合后纹理重映射,波及到纹理替换、网格 (纹理) 开展、二三维仿射矩阵计算、投影矩阵 ……,须要大量篇幅介绍,这里暂且留坑吧。

留神:对于本篇文章的细节 (蕴含纹理映射局部) 已于去年 (2021 年) 申请发明专利,目前状态还在实申中,专利中次要蕴含了拟合的数学公式推导、纹理映射计算等相干内容。

正文完
 0