
好久没写技术文章了(笑
今天来写一个比较简单(操蛋)的技术问题,如何对人脸之类的纹理做UV展开,并且保证一定的效果?
现在来抛砖引玉一下,在不使用GL和directx库的情况下展开较为可用的uv纹理并且保存为png
我使用的三维模型格式是.obj格式,该格式拥有的点,颜色和三角面信息。颜色信息由贴图提供。现在面临的问题是:我的texture是属于两个不同的图片的,而这两个图片100%是没法拼接的
1.如何处理人脸拼接?


类似这两张,使用cv的融合方法是完全没用的
所以方法还是要回到三维和二维的上面
我的方法是实现了一个opencv实现的三维面片贴图算法
贴图嘛,最简单的方法就是三角变换。obj里面是带三角面信息的,通过三角面的映射,我们可以将图片从贴图贴在obj模型上。但是反之能不能行呢?通过一个投影矩阵,将A面的点云贴到B面上?
这里就需要使用warpAffine算法了。只要将通过投影矩阵,获取匹配的三角形,就能把左脸的贴图贴到右脸去。


2.如何uv展开?
合理的对人脸的uv展开永远是非常麻烦的事情,虽然maya有,但是maya不开源啊。所以我手撸了一个简单的uv展开
很简单,只要获取的标志点,将人脸的调整至坐标系,将其竖起来,然后拟合人脸柱面
使用柱面作为平面,就能获得较好的人脸uv展开结果,配合上文的三角面贴图算法,就能获得较好的效果
如图A,B所示



计算时间<1S,C++的效率还是高
3.效果与不足
当然是有不足的,耳朵这边没法比较好的展开(因为耳朵的贴图相对于人脸效果较复杂)
接缝处还是有一点点问题的
但是单纯用来展示没啥太大问题嘛(
版权声明:本文为weixin_36359107原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。