Opencv 从视频中的单应性提取人脸旋转

Opencv 从视频中的单应性提取人脸旋转,opencv,computer-vision,surf,homography,qr-decomposition,Opencv,Computer Vision,Surf,Homography,Qr Decomposition,我试图确定视频中人脸的方向 视频从脸部正面图像开始,因此没有旋转。在下面的帧中,头部旋转,我试图确定旋转,这将导致我根据相机位置确定面部方向 我使用OpenCV和C++来完成这个任务。 我用SURF描述符在脸上找到点,我用它来计算两幅图像之间的单应性。由于这两个帧彼此非常接近,因此在该间隔内头部旋转将是最小的,并且我的单应矩阵将接近单位矩阵 这是我的单应矩阵: H = findHomography(k1,k2,RANSAC,8); 其中k1和k2是使用SURF提取的关键点 我用它来提取旋转矩阵

我试图确定视频中人脸的方向

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

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

这是我的单应矩阵:

H = findHomography(k1,k2,RANSAC,8);
其中k1和k2是使用SURF提取的关键点

我用它来提取旋转矩阵,但现在我不知道如何解释旋转矩阵。这一个也基本上是(100;01 0;01)(其中0是从e-10到e-16范围内的数字)

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

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


谢谢

单应矩阵的左上角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)