2

我正在尝试确定视频中人脸的方向。

视频从脸部的正面图像开始,因此没有旋转。在以下帧中,头部旋转,我试图确定旋转,这将引导我根据相机位置确定面部方向。

我正在使用 OpenCV 和 C++ 来完成这项工作。我正在使用 SURF 描述符来查找脸上的点,我用这些点来计算两个图像之间的单应性。由于两帧彼此非常接近,因此在该间隔内头部旋转将最小,并且我的单应矩阵将接近单位矩阵。

这是我的单应矩阵:

H = findHomography(k1,k2,RANSAC,8);

其中 k1 和 k2 是使用 SURF 提取的关键点。

我正在使用decomposeProjectionMatrix来提取旋转矩阵,但现在我不确定如何解释 rotMatrix。这个也基本上是 (1 0 0; 0 1 0; 0 0 1) (其中 0 是从 e-10 到 e-16 范围内的数字)。

理论上,试图做的是找到每帧的旋转角度并将其存储在某个地方,这样如果我在每帧中得到 1° 的变化,在 10 帧之后我知道我的头已经改变了它的方向10°。

我花了一些时间阅读我能找到的关于 QR 分解、单应矩阵等的所有内容,但我无法解决这个问题。因此,任何帮助将不胜感激。

谢谢!

4

1 回答 1

0

单应矩阵的左上角 2x2 是一个 2D 旋转矩阵。如果你通过矩阵乘以一个点(即取 R*p),你会看到它相当于:

newX = oldVector dot firstRow
newY = oldVector dot secondRow

换句话说,矩阵的第一行是一个单位向量,它是新头部的 x 轴。(如果帧之间存在比例差异,它将不是单位向量,但这种方法仍然有效。)所以你应该能够计算

rotation = atan2(second entry of first row, first entry of first row)
于 2014-09-03T02:27:10.923 回答