gdiplus拼接两张图片_全网最简单的人脸UV展开+拼接

fbd46fd80f561ad953c4de3a62309940.png

好久没写技术文章了(笑

今天来写一个比较简单(操蛋)的技术问题,如何对人脸之类的纹理做UV展开,并且保证一定的效果?

现在来抛砖引玉一下,在不使用GL和directx库的情况下展开较为可用的uv纹理并且保存为png

我使用的三维模型格式是.obj格式,该格式拥有的点,颜色和三角面信息。颜色信息由贴图提供。现在面临的问题是:我的texture是属于两个不同的图片的,而这两个图片100%是没法拼接的

1.如何处理人脸拼接?

393cc08044311df94b6f790ea529544f.png

22a1c61bc97d28a5f5cfd480fe5b53c4.png

类似这两张,使用cv的融合方法是完全没用的

所以方法还是要回到三维和二维的上面

我的方法是实现了一个opencv实现的三维面片贴图算法

贴图嘛,最简单的方法就是三角变换。obj里面是带三角面信息的,通过三角面的映射,我们可以将图片从贴图贴在obj模型上。但是反之能不能行呢?通过一个投影矩阵,将A面的点云贴到B面上?

这里就需要使用warpAffine算法了。只要将通过投影矩阵,获取匹配的三角形,就能把左脸的贴图贴到右脸去。

bf1821b9710de4d378851dc7b44da92c.png

d5863e941a2b384c68236fe250054fce.png
通过映射投影出来的小面片

2.如何uv展开?

合理的对人脸的uv展开永远是非常麻烦的事情,虽然maya有,但是maya不开源啊。所以我手撸了一个简单的uv展开

很简单,只要获取的标志点,将人脸的调整至坐标系,将其竖起来,然后拟合人脸柱面

使用柱面作为平面,就能获得较好的人脸uv展开结果,配合上文的三角面贴图算法,就能获得较好的效果

如图A,B所示

d4427c8eae258996f528b0f24da374b4.png
展开的半边UV

5751827d1bf91a18bf54311f337605d7.png
展开的人脸UV

500a14b0d562d6c9cf06b8671dc75c67.png
三维点云效果图

计算时间<1S,C++的效率还是高

3.效果与不足

当然是有不足的,耳朵这边没法比较好的展开(因为耳朵的贴图相对于人脸效果较复杂)

接缝处还是有一点点问题的

但是单纯用来展示没啥太大问题嘛(


版权声明:本文为weixin_36359107原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。