我正在尝试确定视频中脸部的方向。
视频以脸部的正面图像开始,因此没有旋转。在下面的帧中,头部旋转,我正在尝试确定旋转,这将导致我根据摄像机位置确定面部方向。
我正在使用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分解,单应性矩阵等的所有内容,但我无法解决这个问题。因此,任何帮助都会非常感激。
谢谢!
答案 0 :(得分:0)
单应矩阵的左上2×2是2D旋转矩阵。如果你通过矩阵与一个点的乘法(即取R * p),你会发现它相当于:
newX = oldVector dot firstRow
newY = oldVector dot secondRow
换句话说,矩阵的第一行是单位向量,它是新头的x轴。 (如果帧之间存在比例差异,它将不是单位矢量,但此方法仍然有效。)所以你应该能够计算
rotation = atan2(second entry of first row, first entry of first row)