2013-05-06 193 views
7

我试图根据2D图像2D image找到人脸的三个角度。使用OpenCV,C++和图像2D进行头部姿态估计 - 几何方法 - 滚动,偏航和俯仰

我使用OpenCV与HaarCascade来寻找脸部,眼睛,鼻子和嘴巴。 但我没有找到任何几何方法可以帮助我找到角度X,Y和Z(滚动,俯仰和偏航)。

有人可以帮助我显示一些方法在c + +或java的工作吗?

+0

这不是一个C++的问题,所以我删除该标签。 – 2013-05-06 15:15:03

回答

5

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

解决这个问题的一个典型方法是要求用户通过直接观察摄像机标定'0'角度来“校准”他们的脸部。此时,您现在拥有可以比较后续图像的参考长度。

然而,长度仍然不是足够的信息,因为视在投影距离的变化量取决于光学元件和脸部距相机的距离。您通常手动配置的镜头;您可以通过假设“平均”面部尺寸并假设“标称”图像完美匹配这些尺寸来估算距离。如果发现超过或低估了某个特定脸部的旋转,则可以将其调整为可调整的。

一旦你完成了所有这些假设,它就是相当简单的几何体。你可以估计从眼睛通过鼻子到嘴巴的速度。您可以测量眼睛之间的间距来估计偏航。最后,您可以使用眼睛/嘴巴或眼睛/鼻子之间的间距来估计音高。请记住,这些假设在脸部仍然非常接近名义时效果最好。

+0

但我想知道一些在C++中的方法来做到这一点。 – 2013-05-07 13:08:47

0

所以,你想根据鼻子,眼睛和嘴巴的位置找到脸部的方向(以RPY角度)。假设所有三个(四 - 二只眼睛)都可见,我将使用脸部的对称特征来确定头部的方向,例如:

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

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

有趣的应用程序的方式!

0

如果使用级联分类检测右眼,左眼和鼻子,计算每一个特征的重心(特征量x/2,功能Y/2),这会给你的形象三个X-Y点。

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

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

您可以通过观察鼻子的Y值检测间距,如果用户查找,Y值将接近双眼Y值,如果他们看不起,Y值将进一步远离眼睛的价值。

现在这当然不是非常准确,不会给你确切的角度,但是你可以使用这些信息尝试和分类某些组内的每个值,即(向前看,向左看,看起来真的是左侧)

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

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

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

旋转,有了这个信息,您可以校正图像,并处理继续(旋转图像查找创建二维旋转矩阵,并使用经仿射)

很抱歉,如果这是一个有点死灵的,但我发现上面的方法是相当成功的,我希望它帮助别人

相关问题