【问题标题】:Head Pose Estimation with OpenCV, C++ and Image 2D - Geometric Method - Roll, Yaw and Pitch使用 OpenCV、C++ 和 Image 2D 进行头部姿势估计 - 几何方法 - 滚动、偏航和俯仰
【发布时间】:2013-04-30 08:54:43
【问题描述】:

我正在尝试根据 2D 图像 找到人脸的三个角度。

我正在使用 OpenCV 和 HaarCascade 来查找脸部、眼睛、鼻子和嘴巴。 但我没有找到任何几何方法可以帮助我找到角度 X、Y 和 Z(Roll、Pitch 和 Yaw)。

有人可以帮我展示一些在 c++ 或 java 中有效的方法吗?

【问题讨论】:

  • 这不是 C++ 问题,所以我删除了那个标签。

标签: c++ opencv geometric-arc euler-angles


【解决方案1】:

如果您使用级联分类器检测右眼、左眼和鼻子,计算每个特征(特征 x/2,特征 y/2)的质心,这将在图像上给出三个 xy 点。

您可以通过查看每只眼睛的 Y 值来检测滚动,如果一只眼睛高于另一只,则表示头部朝最低 Y 值的方向倾斜(一只眼睛向上移动,另一只眼睛向下移动)

您可以通过查看鼻子的X值来检测偏航,如果用户向左看,他们的鼻子的X值将更接近他们左眼的X值,与向右看的相同右眼X值。

您可以通过查看鼻子的 Y 值来检测俯仰,如果用户向上看,Y 值将更接近双眼 Y 值,如果他们向下看,Y 值将更远离眼睛眼值。

现在这当然不是非常准确,也不会为您提供确切的角度,但是您可以使用此信息尝试对某些组中的每个值进行分类,即(向前看、向左看、真正看 em> 左)

我能看到影响您在一张图像中计算所有三个的唯一因素可能是,如果滚动相当剧烈,计算偏航可能会很麻烦,因为 X 轴不再平坦。

您可以通过 2D 旋转校正图像来解决此问题。 您将需要找出图像需要旋转多少

Value = (right eye Y / 2) - (left eye Y / 2)

利用这些信息,您可以校正图像并继续处理(旋转图像查找创建 2D 旋转矩阵并使用变形仿射)

对不起,如果这有点死,但我发现上述方法非常成功,我希望它对某人有所帮助

【讨论】:

    【解决方案2】:

    因此,您希望根据鼻子、眼睛和嘴巴的位置来确定人脸的方向(以 RPY 角度表示)。假设所有三个(四 - 两只眼睛)都是可见的,我会使用面部的对称特征来确定头部的方向,例如:

    眼睛之间的一条线可以用作其中一个轴的参考(例如 Pitch)。然后,我们可以假设 Roll 轴指向鼻子的方向——这可以通过鼻子到眼睛中点的位置位移来测量。最后,可以通过眼睛中点、鼻子位置和嘴巴位置之间的距离关系来测量偏航角。

    我不知道四个兴趣点之间的距离关系,他们可能在性别、年龄和来源方面有所不同。然而,如果你能找到这样的关系,那么角度的推导在数学上应该是相当直接的。

    顺便说一句有趣的应用程序!

    【讨论】:

      【解决方案3】:

      给定一张图像而没有其他信息,对于角度没有单一的解决方案。考虑只是 Yaw 的情况。投影到 2d 平面上,可以看到眼睛之间的投影距离和眼睛相对于鼻子/嘴巴的位置的微小变化。然而,人与人之间的距离并不是一个常数。

      解决此问题的一种典型方法是要求用户通过直视相机的标称“0”角度来“校准”他们的面部。此时,您现在有了可以比较后续图像的参考长度。

      但是,长度信息仍然不够充分,因为表观投影距离的变化量取决于光学元件和面部与相机的距离。您通常手动配置的光学器件;您可以通过假设“平均”面部尺寸并假设“标称”图像与这些尺寸完美匹配来估计的距离。如果您发现它高估或低估了特定面的旋转,您可以调整它。

      一旦你有了所有这些假设,它就是相当简单的几何图形。您可以估计从眼睛到鼻子到嘴巴的线的滚动。您可以测量眼睛之间的间距以估计偏航。最后,您可以使用眼睛/嘴巴或眼睛/鼻子之间的间距来估计音高。请记住,当面部仍然非常接近名义值时,这些假设最有效。

      【讨论】:

      • 但我想知道 C++ 中的一些方法来做到这一点。
      猜你喜欢
      • 2011-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多