将人脸侧面图像与其正面图像对齐

5
我有一个侧面照片:

enter image description here

和一个正面照片:

enter image description here

输出:将侧面照片与正面照片对齐。 想法:我只需要知道可以在两张照片上都看到哪三个共同点,然后使用仿射变换来显示对齐的侧面照片。
      OR any other **simple method** of doing so

开发环境: c++ 和 OpenCV 2.4.2

我尝试过的方法:

  1. 使用 Haarcascade 特征检测(共同检测点在两个图像中都为眼睛);但无法在正面人脸上检测到耳朵。
  2. OpenCV: 将人脸图像相对于参考图像进行平移/对齐 (图像注册)(我收到了错误消息)。

1
一般而言,如果能够正确提取和匹配特征,则拼接器应该适用于所有类型的图像。estimateTransform函数返回一个cv::Status值,您可以检查一下吗? - Micka
在命令窗口中,它会在“Pairwise matching, time=”处停止处理图像。它无法到达estimateTransform。 - Steph
你遇到了什么错误? - Liam McInroy
我已经纠正了它。然而,我无法在主要的http://pastebin.com/S2etkzrC中继续。 - Steph
@Steph,为什么不使用STASM或Flandmark检测器来检测一些面部地标(眼睛、鼻子、下巴)? - GilLevi
2个回答

5

正如 @bytefish 在这里讨论的那样,找到给定图像中眼睛的精确位置远非易事。在OpenCV中找到眼睛的Haar-cascades会产生太多误报,而且这种方法对于图像旋转不稳健。

你需要强大的头部姿势估计来对齐面部图像。以下是两个最强大的方法(附有可用代码):


例如,使用第二篇论文中描述的方法,您将获得更加稳健的特征,如下图所示。而这些稳健的特征又将确保生成更加稳健的人脸对齐性能。

enter image description here

enter image description here


谢谢@herohuyongtao,但我需要一个更简单的方法,而且它不一定是稳健的。 - Steph

1
如果您想要寻找真正简单的方法,可以把您的嘴巴看作平面物体上的一条线,并通过线条缩短的数量来计算旋转角度。不过,当您拍照或编写代码时千万不要微笑。
更酷的方法是将您的脸部映射为纹理到预定义的3D模型上,并旋转它,直到与您的侧面轮廓最匹配。
当然,正确的方法是使用一组不同的头部旋转来训练一个二元分类器,仅进行成对强度比较,就像Lepetit paper中所述。

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