python表情换头_人脸头部姿态估计的 Python 实现[转]

坐标变换:利用世界坐标系旋转、平移矩阵,将 3D点 从世界坐标系变换到相机坐标系中. 即:通过算法完成世界坐标系(3D)、2D landmark输入image、相机坐标系之间的映射转换和标定.

8ccab2693938c0f6.png

2D人脸特征点与3D世界坐标系的对应点

1. 计算旋转矩阵和平移矩阵

[基于OpenCV和Dlib的头部姿态估计[译] - AIUAI](

2. 旋转矩阵转换为欧拉角

Yaw:摇头 左正右负

Pitch:点头 上负下正

Roll:摆头(歪头)左负 右正

19cf3fa505372bc0.png// C++

static cv::Vec3d RotationMatrix2Euler(const cv::Matx33d& rotation_matrix)

{

double q0 = sqrt(1 + rotation_matrix(0, 0) + rotation_matrix(1, 1) + rotation_matrix(2, 2)) / 2.0;

double q1 = (rotation_matrix(2, 1) - rotation_matrix(1, 2)) / (4.0*q0);

double q2 = (rotation_matrix(0, 2) - rotation_matrix(2, 0)) / (4.0*q0);

double q3 = (rotation_matrix(1, 0) - rotation_matrix(0, 1)) / (4.0*q0);

double t1 = 2.0 * (q0*q2 + q1*q3);

double yaw = asin(2.0 * (q0*q2 + q1*q3));

double pitch = atan2(2.0 * (q0*q1 - q2*q3), q0*q0 - q1*q1 - q2*q2 + q3*q3);

double roll = atan2(2.0 * (q0*q3 - q1*q2), q0*q0 + q1*q1 - q2*q2 - q3*q3);

return cv::Vec3d(pitch, yaw, roll);

}% matlab

function [euler] = Rot2Euler(R)

q0 = sqrt( 1 + R(1,1) + R(2,2) + R(3,3) ) / 2;

q1 = (R(3,2) - R(2,3)) / (4*q0) ;

q2 = (R(1,3) - R(3,1)) / (4*q0) ;

q3 = (R(2,1) - R(1,2)) / (4*q0) ;

yaw = asin(2*(q0*q2 + q1*q3));

pitch= atan2(2*(q0*q1-q2*q3), q0*q0-q1*q1-q2*q2+q3*q3);

roll = atan2(2*(q0*q3-q1*q2), q0*q0+q1*q1-q2*q2-q3*q3);

euler = [pitch, yaw, roll];

Python 实现:# Python

class PnpHeadPoseEstimator:

"""

基于 OpenCV PnP 算法实现的头部姿态估计.

It finds Roll, Pitch and Yaw of the head given a figure as input.

It uses the PnP algorithm and it requires the dlib library

"""

def __init__(self, cam_w, cam_h, dlib_shape_predictor_file_path):

"""

@param c

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值