头部姿态检测的意义:
(1) 注意力检测:通过判断头部姿态可以判断人的注意力情况。比如可以检测长途司机是不是在目视前方,长时间不目视前方
(2) 行为分析:通过视频监控分析再辅助其他算法可以判断一个人是否具有不轨行为,做到提前预警,防患于未然
(3) 人机互动:人的头部动作有时可以表示意义,传递信息。摇头在大多数人看来是否认,点头表示同意
(4) 视线追踪:也可以称为眼球跟踪,准确的 头部姿态估计能够提高视线追踪的精度
头部姿态检测是通过2D图像映射到3D图像,得到人脸姿态的朝向,主要检测的参数有三个,分别是pitch(围绕X轴旋转),yaw(围绕Y轴旋转)和roll(围绕Z轴旋转),分别学名俯仰角、偏航角和滚转角,就是抬头、摇头和转头。
主要的检测方法有三种:
1、经典版:2D人脸关键点检测--->3D人脸模型匹配求解--->3D点和对应2D点的转换关系--->根据旋转矩阵求解欧拉角
代码链接:/JuneoXIE/mtcnn-opencv_face_pose_estimation/blob/bedc3e7503190b2d468f64ef01a48d0e61ed3e3c/pose_estimate.py(用MTCNN,可参考)
物体相对于相机的姿态可以使用旋转矩阵和平移矩阵来表示:
(1)平移矩阵:物体相对于相机的空间位置关系矩阵,用T表示;
(2)旋转矩阵:物体相对于相机的空间姿态关系矩阵,用R表示。
对于坐标转换,涉及到几个坐标系:世界坐标系(UVW)、相机坐标系(XYZ)、图像中心坐标系(uv)和图像像素坐标系(xy)
图像坐标系:理想的图像坐标系原点O1和真实的O0有一定的偏差,由此我们建立了等式(1)和(2),可以用矩阵形式(3)表示。
相机坐标系(C)和世界坐标系(W):通过相机与图像的投影关系,我们得到了等式(4)和等式(5),可以用矩阵形式(6)表示
我们又知道相机坐标系和世界坐标的关系可以用等式(7)表示:
由等式(3),等式(6)和等式(7)我们可以推导出图像坐标系和世界坐标系的关系:
其中M1称为相机的内参矩阵,包含内参(fx,fy,u0,v0)。M2称为相机的外参矩阵,包含外参(R:旋转矩阵,T:平移矩阵)
opencv中的solvePnP函数:知道世界坐标系内点的位置、像素坐标位置和相机参数就可以搞定旋转和平移矩阵,如下:
cv2.solvePnP(objectPoints, imagePoints, cameraMatrix, distCoeffs[, rvec[, tvec[, useExtrinsicGuess[, flags]]]]) → retval, rvec, tvec
objectPoints:世界坐标系中的3D点坐标,单位mm
imagePoints:图像坐标系中点的坐标,单位像素
cameraMatrix:相机内参矩阵
distCoeffs:畸变系数
rvec:旋转矩阵
tvec:平移矩阵
useExtrinsicGuess:是否使用提供的rvec和tvec初始化调优。
flags:SOLVEPNP _ITERATIVE、SOLVEPNP _P3P、SOLVEPNP _EPNP、SOLVEPNP _DLS、SOLVEPNP _UPNP
2、SVM训练和预测
3、深度学习版