人脸姿态估计主要是获得脸部朝向的角度信息。一般可以用旋转矩阵、旋转向量、四元数或欧拉角表示(这四个量也可以互相转换)。一般而言,欧拉角可读性更好一些,使用更为广泛。本文获得的人脸姿态信息用三个欧拉角(pitch,yaw,roll)表示,通俗讲就是抬头、摇头和转头。

话不多说,先上图:

代码部分解答:

本例中只是用了14个关键点,主要是因为通用的3D人脸模型的标注方式和dlib检测出来的点不对应,因此选择了部分共同的特征,points_68 代表的部分检测出来的点,排列方式与model_points 对应。

代码如下:

import cv2
import matplotlib.pyplot as plt
import numpy as np
import dlib
import os
import sys
import math
model_points = np.array([[6.825897, 6.760612, 4.402142],[1.330353, 7.122144, 6.903745],[-1.330353, 7.122144, 6.903745 ],[-6.825897, 6.760612, 4.402142],[5.311432, 5.485328, 3.987654],[1.789930, 5.393625, 4.413414],[-1.789930, 5.393625, 4.413414],[-5.311432, 5.485328, 3.987654],[2.005628, 1.409845, 6.165652],[-2.005628, 1.409845, 6.165652],[2.774015, -2.080775, 5.048531],[-2.774015, -2.080775, 5.048531],[0.000000, -3.116408, 6.097667],[0.000000, -7.415691, 4.070434]])
detector = dlib.get_frontal_face_detector()
pic_path = "/media/xxxxx/5874eb32-3573-4145-9cce-b105957df272/data_process/data_pro/solov2/5007442_2.jpg"
img = cv2.imread(pic_path)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
faces = detector(img, 2)
face = faces[0]
x0,y0,x1,y1 = face.left(),face.top(),face.right(),face.bottom()
cv2.rectangle(img, (x0,y0), (x1,y1), (255,0,0), 2) #画个人脸框框
predictor = dlib.shape_predictor('/media/zhoukx/5874eb32-3573-4145-9cce-b105957df272/data_process/data_pro/solov2/shape_predictor_68_face_landmarks.dat')
ldmk = predictor(img, face) points = np.array([(p.x, p.y) for p in ldmk.parts()],dtype="double")
#17 left brow left corner
#21 left brow right corner
#22 right brow left corner
#26 right brow right corner
#36 left eye left corner
#39 left eye right corner
#42 right eye left corner
#45 right eye right corner
#31 nose left corner
#35 nose right corner
#48 mouth left corner
#54 mouth right corner
#57 mouth central bottom corner
#8 chin cornerpoints_68 = np.array([points[17],points[21],points[22],points[26],points[36],points[39],points[42],points[45],points[31],points[35],points[48],points[54],points[57],points[8]
],dtype="double")
size=img.shape
focal_length = size[1]
center = (size[1]/2, size[0]/2)
camera_matrix = np.array([[focal_length, 0, center[0]],[0, focal_length, center[1]],[0, 0, 1]], dtype = "double")print ("Camera Matrix :\n {0}".format(camera_matrix))dist_coeffs = np.zeros((4,1)) # Assuming no lens distortion
(success, rotation_vector, translation_vector) = cv2.solvePnP(model_points, points_68, camera_matrix, dist_coeffs)print ("Rotation Vector:\n {0}".format(rotation_vector))
print ("Translation Vector:\n {0}".format(translation_vector))theta = np.linalg.norm(rotation_vector)
r = rotation_vector / theta
R_ = np.array([[0, -r[2][0], r[1][0]],[r[2][0], 0, -r[0][0]],[-r[1][0], r[0][0], 0]])
R = np.cos(theta) * np.eye(3) + (1 - np.cos(theta)) * r * r.T + np.sin(theta) * R_
print('旋转矩阵')
print(R)
def isRotationMatrix(R):Rt = np.transpose(R)  shouldBeIdentity = np.dot(Rt, R)   I = np.identity(3, dtype=R.dtype)         n = np.linalg.norm(I - shouldBeIdentity)   return n < 1e-6                           def rotationMatrixToAngles(R):assert (isRotationMatrix(R))   sy = math.sqrt(R[0, 0] * R[0, 0] + R[1, 0] * R[1, 0])  singular = sy < 1e-6  if not singular:  x = math.atan2(R[2, 1], R[2, 2])y = math.atan2(-R[2, 0], sy)z = math.atan2(R[1, 0], R[0, 0])else:            x = math.atan2(-R[1, 2], R[1, 1])y = math.atan2(-R[2, 0], sy)  z = 0x = x*180.0/3.141592653589793y = y*180.0/3.141592653589793z = z*180.0/3.141592653589793line = 'pitch:{:.1f}\nyaw:{:.1f}\nroll:{:.1f}'.format(y,x,z)print('{},{}'.format(os.path.basename(pic_path), line.replace('\n',',')))y = 20for _, txt in enumerate(line.split('\n')):cv2.putText(img, txt, (20, y), cv2.FONT_HERSHEY_PLAIN, 1.3, (0,0,255), 1)y = y + 15for p in points_68:cv2.circle(img, (int(p[0]),int(p[1])), 2, (0,255,0), -1, 0)cv2.imshow('img', img)if cv2.waitKey(-1) == 27:passreturn np.array([x, y, z])
n = isRotationMatrix(R)
x_y_z = rotationMatrixToAngles(R)
print(x_y_z)

参考文章:

1 人脸姿态估计(计算欧拉角)_sunnygirl's house-CSDN博客_人脸姿态估计

2 关于人脸关键点的数据集WFLW数据预处理_baidu_40840693的博客-CSDN博客

3  GitHub - lincolnhard/head-pose-estimation: Real-time head pose estimation built with OpenCV and dlib

4 重磅!头部姿态估计「原理详解 + 实战代码」来啦!

人脸姿态估计(代码已跑通)相关推荐

  1. yolov3网络结构图_目标检测——YOLO V3简介及代码注释(附github代码——已跑通)...

    GitHub: liuyuemaicha/PyTorch-YOLOv3​github.com 注:该代码fork自eriklindernoren/PyTorch-YOLOv3,该代码相比master分 ...

  2. 111个Python数据分析实战项目,代码已跑通,数据可下载

    写在前面: 这里整理了111个数据分析的案例,每一个都进行了严格的筛选,筛选标准如下: 1. 有干货:杜绝纯可视化.统计性分析,有一定比例的讲解性文字 2. 可跑通:所有代码均经过测试,(大概率)可以 ...

  3. LeNet-5N 网络模型及对应代码自用已跑通

    先来结构图 再上数据结果 # 三个列表对应代码中的三个print的结果 # 这个是epoch的loss 波动很大,所以再绘制时我用的另一个列表为train_loss_sum_batch_size_li ...

  4. 跳过人脸检测和关键点定位,Facebook等提出实时3D人脸姿态估计新方法

    本文转载自机器之心. 来自 Facebook AI 和美国圣母大学的研究者提出了一种 6 自由度的实时 3D 人脸姿态估计技术,可以不依赖人脸检测和人脸关键点定位独立运行. 人脸检测是给照片中的每个人 ...

  5. 人脸姿态估计预研(二)

    人脸姿态估计预研(二) 1. 背景 为什么要写第二篇,因为第一篇写的很简单,自己的思考部分比较少,并且还有一些细节需要补充 2. 算法部分 2.1 到底使用多少个点? 这个确实是一个比较实在的问题,因 ...

  6. 无需人脸检测,实时6自由度3维人脸姿态估计img2pose

    效果图: 提出了一种实时的6自由度3D人脸姿态估计方法,其不依赖于人脸检测和关键点对齐.我们观察到直接估计6自由度刚体变换是一个比在3D人脸对齐中广泛使用的关键点检测更简单的问题.基于此我们做出了一下 ...

  7. 无需人脸检测,实时3维人脸姿态估计img2pose 2020

    提出了一种实时的6自由度3D人脸姿态估计方法,其不依赖于人脸检测和关键点对齐.我们观察到直接估计6自由度刚体变换是一个比在3D人脸对齐中广泛使用的关键点检测更简单的问题.基于此我们做出了一下几个贡献( ...

  8. 人脸姿态估计(计算欧拉角)

    1.什么是人脸姿态估计问题 人脸姿态估计主要是获得脸部朝向的角度信息.一般可以用旋转矩阵.旋转向量.四元数或欧拉角表示(这四个量也可以互相转换).一般而言,欧拉角可读性更好一些,使用更为广泛.本文获得 ...

  9. 大疆 DJI mobile SDK系列详细教程——运行实例代码(跑通大疆官方提供Mobile SDK里的sample code)

    大疆 DJI mobile SDK系列详细教程--运行实例代码(跑通大疆官方提供Mobile SDK里的sample code) 文章目录 一.官方文献与资源地址 二.操作步骤 提示:昨天在尝试跑通大 ...

最新文章

  1. 在Vmware中安装Ubuntu
  2. Linux平台Qt creator报错:Circular all - first dependency dropped
  3. typescript类型断言
  4. m_pMainWnd = dlg错误解决方法
  5. BugkuCTF-WEB题file_get_contents
  6. oracle错误01653,oracle 10g 错误 ORA 01653 的解决过程
  7. linux怎么显示目录层次结构,Linux基础(层级结构、基础命令)
  8. Python2.7.3 Tkinter Entry(文本框) 说明
  9. 挑战程序设计竞赛: Fence Repair
  10. 网页资源下载 -- 水浒传全集
  11. linux下 安装企业微信
  12. 【Java】实现多线程计算阶乘(完整版)
  13. 如何储存图片方法jpg格式png格式#ps教程#ps抠图
  14. 【100%通过率】华为OD机试真题 C++ 实现【最优芯片资源占用】【2023 Q1 | 100分】
  15. 共享办公室,月赚2万-5万的阳光创业项目
  16. Idea快捷键大全(Windows)保存起来,用着就来看看。。
  17. 基于HSV+HOG特征和SVM的人脸口罩检测算法
  18. 【视觉-摄像机1】opencv 调用工业摄像机(USB接口和GigE接口)
  19. Actel FPGA——RAM-two port入门操作
  20. element刷新表单校验

热门文章

  1. 和信贷上市1周年:专注突破 见变未来
  2. Sentry基本原理
  3. 滁州学院计算机专业如何,滁州学院计算机系怎么样
  4. java增强for循环对比_foreach(增强for循环)和for的区别
  5. 天书奇谈手游怎么用电脑玩 天书奇谈手游安卓模拟器教程
  6. 如何学好WPF 【转】
  7. GandCrab勒索病毒就此销声匿迹了吗?
  8. 三个OpenStack自动化部署工具:Devstack,OSA,Kolla对比
  9. oracle安装问题--需要安装.net Framework 3.5的问题
  10. stm32单片机使用串口通信连接GY-33颜色传感器完成对颜色的识别并且打印出其颜色和对应的RGB值