Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用OpenCV,C+估计头部姿势+;和图像2D-几何方法-横摇、偏航和俯仰_C++_Opencv_Geometric Arc_Euler Angles - Fatal编程技术网

C++ 用OpenCV,C+估计头部姿势+;和图像2D-几何方法-横摇、偏航和俯仰

C++ 用OpenCV,C+估计头部姿势+;和图像2D-几何方法-横摇、偏航和俯仰,c++,opencv,geometric-arc,euler-angles,C++,Opencv,Geometric Arc,Euler Angles,我试图根据2D图像找到一个人面部的三个角度 我使用OpenCV和HaarCascade来查找面部、眼睛、鼻子和嘴巴。 但我没有找到任何几何方法可以帮助我找到角度X,Y和Z(横摇,俯仰和偏航) P>有人能帮助我在C++或java中显示一些方法吗?给定一个图像,没有其他信息,没有角度的单一解决方案。考虑一下偏航的情况。投影到2d平面上,可以看到眼睛之间的投影距离以及眼睛相对于鼻子/嘴的位置的微小变化。然而,人与人之间的距离并不是一个常数 解决这一问题的一个典型方法是,要求用户通过直视摄像机的标称“

我试图根据2D图像找到一个人面部的三个角度

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


<> P>有人能帮助我在C++或java中显示一些方法吗?

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

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

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


一旦你有了所有这些假设,它就相当简单了。您可以估计从眼睛到鼻子到嘴的直线的滚动。可以测量两眼之间的间距以估计偏航。最后,您可以使用眼睛/嘴或眼睛/鼻子之间的间距来估计音高。请记住,这些假设在面部仍然相当接近标称时最有效。

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

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

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


有趣的应用程序

如果使用级联分类器检测右眼、左眼和鼻子,计算每个特征(特征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)
使用此信息,您可以更正图像并继续处理(要旋转图像查找,请创建二维旋转矩阵并使用扭曲仿射)


对不起,如果这有点不好,但我发现上面的方法非常成功,我希望它能帮助某人< /p>这不是一个C++问题,所以我删除了那个标签。但是我想知道C++中的一些方法。