我正在尝试根据2D图像找到人脸的三个角度。
我正在使用OpenCV和HaarCascade来寻找面部,眼睛,鼻子和嘴巴。 但我没有找到任何几何方法可以帮助我找到角度X,Y和Z(滚动,俯仰和偏航)。
有人可以帮我展示一些有效的c ++或java方法吗?
答案 0 :(得分:5)
鉴于单个图像而没有其他信息,角度没有单一的解决方案。考虑一下Yaw的情况。投射到2d平面上,这可以看作是眼睛之间的投射距离和眼睛相对于鼻子/嘴巴的位置的微小变化。然而,这个距离在人与人之间不是一个常数。
一种典型的方法是要求用户通过直接观察相机的标称“0”角来“校准”他们的脸部。此时,您现在可以使用参考长度来比较后续图像。
然而,长度仍不是足够的信息,因为表观投影距离的变化量取决于光学器件和面部与相机的距离。您通常手动配置的光学器件;您可以通过假设“平均”面部尺寸并假设“标称”图像与这些尺寸完美匹配来估计距离。如果您发现特定面部的旋转估计过高或过低,则可以对此进行调整。
一旦你有了所有这些假设,它就是相当简单的几何。您可以估算从眼睛到鼻子到嘴巴的直线滚动。您可以测量眼睛之间的间距来估计偏航。最后,您可以使用眼睛/嘴巴或眼睛/鼻子之间的间距来估计音高。请记住,当面部仍然非常接近名义时,这些假设最有效。
答案 1 :(得分:0)
因此,您希望根据鼻子,眼睛和嘴巴的位置找到脸部的方向(以RPY角度)。假设所有三个(四眼 - 两只眼睛)都可见,我会使用面部的对称特征来确定头部的方向,例如:
眼睛之间的线可以用作其中一个轴(例如Pitch)的参考。然后,我们可以假设Roll轴指向鼻子的方向 - 这可以通过鼻子到眼睛中点的位置位移来测量。最后,可以通过眼睛中点,鼻子位置和嘴巴位置之间的距离关系来测量偏航。
我不知道四个兴趣点之间的距离关系,它们在性别,年龄和出身方面可能有所不同。但是,如果你能找到这样的关系,那么角度的推导在数学上应该是相当直接的。
顺便提一下有趣的应用程序!
答案 2 :(得分:0)
如果你使用级联分类器来检测右眼,左眼和鼻子,计算每个特征的质心(特征x / 2,特征y / 2),这将在你的图像上给你三个xy点。
您可以通过查看每只眼睛的Y值来检测滚动,如果一只眼睛高于另一只眼睛,则意味着头部在最低Y值的方向上倾斜(当一只眼睛向上移动而另一只眼睛向下移动时)
你可以通过查看鼻子的X值来检测偏航,如果用户向左看,鼻子的X值将更接近他们左眼的X值,并且在向右看时也是如此。右眼X值。
您可以通过查看鼻子的Y值来检测音高,如果用户向上看,Y值将更接近双眼Y值,如果他们向下看,Y值将更远离眼睛价值。
现在这当然不是非常准确,并且不会给你准确的角度,但是你可以使用这些信息来尝试对某些群体中的每个值进行分类,即(向前看,向左看,看起来真的 left)
我能看到影响你在一张图像中计算所有三个图像的唯一方法可能就是如果滚动相当剧烈,计算偏航可能会很麻烦,因为X轴不再是平坦的。
您可以通过2D旋转校正图像来解决此问题。 您需要找到需要旋转的图像
Value = (right eye Y / 2) - (left eye Y / 2)
使用此信息,您可以更正图像并继续处理(旋转图像查找创建2D旋转矩阵并使用扭曲仿射)
对不起,如果这是一个坏死但我发现上述方法非常成功,我希望它可以帮助某人