将非正面的脸旋转到正面 opencv

7

我已经苦恼了一个星期,无法将非正面的面旋转到正面,就像这张image图片中的左侧面到右侧面那样。

enter image description here

1)我使用了learnopencv网站上的delaunay教程,获取了左脸的所有三角形(大约138个三角形),如下所示:

...

triangle num 4: [100, 383] | [120, 374] | [112, 385]

triangle num 5: [120, 374] | [100, 383] | [92, 345]

triangle num 6: [136, 396] | [137, 379] | [151, 394]

triangle num 7: [137, 379] | [136, 396] | [118, 395]

triangle num 8: [92, 345] | [86, 414] | [80, 451]

triangle num 9: [86, 414] | [92, 345] | [100, 383]

triangle num 10: [86, 414] | [100, 383] | [118, 395]

triangle num 11: [116, 336] | [120, 374] | [92, 345]

triangle num 12: [120, 374] | [116, 336] | [133, 344]

...

2). 还需要使用这个库:https://github.com/chili-epfl/attention-tracker(可以估计头部姿态)来获取左侧脸部的头部姿态的4x4矩阵变换,该矩阵似乎是opencv中Rodrigues函数的结果。

 0.659585  -0.749291 -0.0592507  0.0591621 

-0.0327269 -0.107385 0.993679    -0.00523744 

-0.750917  -0.653477 -0.0953513  -0.280204 

 0         0         0           1 

所以我不知道接下来该怎么做,才能用步骤2的4x4矩阵旋转步骤1中的所有三角形来得到右面的结果。请帮忙!


也许一些代码和图片会有助于获得答案... - tfv
代码很长,阅读起来很费劲,因此我认为在这里展示我的代码结果会更清晰。更具体地说,我的三角形列表声明如下: cv::vector<cv::vector<Point2f> > list_tri_points 因此,每个项目都将是一个包含2D点的列表,就像步骤1中的结果一样。而在步骤2中的4x4矩阵,我将其存储在cv :: Mat类型的变量中。我想要实现的是,通过使用4x4矩阵,以某种方式将list_tri_points中的所有三角形转换为新的三角形列表。并且这个新的三角形列表将呈现给一个正面。 - Rain Maker
1个回答

4
如何将非正面视图的脸投影到正面视图是一个复杂的问题,即使您已经投影了脸部的地标位置。 我建议使用我之前使用过的两个开源库。
第一个是由MIT提供的。这段代码不仅是脸部正面化程序,还可以用于任何对象。 https://bitbucket.org/gbhuang/congealreal 第二个库链接如下,仅提供脸部投影功能。

https://github.com/eranid/adience_align

我认为第二个库最有用。


感谢Zangeneh回答我的问题。我的目的是通过比较输入图像(非正面人脸图像)中所有可能的标志点对之间的比率与存储图像(正面人脸图像)的比率来进行人脸识别。但是由于非正面人脸,比率可能不正确,所以我必须将其转换为正面人脸,然后计算比率。但是如果像你说的那样,这是一个复杂的问题,是否有其他解决方案可以正确比较两个人脸的比率,考虑姿势差异但不涉及人脸投影? - Rain Maker
如果您想要实现能够识别不同姿势下的人脸的人脸识别系统,有两种方法。第一种方法是使用正面化模块,第二种方法是使用人脸姿态估计,如果人脸非正面,则将其丢弃。 - erfan zangeneh
嗨,Zangeneh,你能否更详细地解释一下在人脸识别中使用姿态估计的具体方法?我还不是很懂。谢谢! - Rain Maker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接