opencv相机标定和人头姿态估计案例

Posted 风翼冰舟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv相机标定和人头姿态估计案例相关的知识,希望对你有一定的参考价值。

前言

头部驱动除了之前关注的表情驱动外,还有眼球驱动和头部方向驱动。本博客基于opencv官方文档和部分开源代码来研究如何基于人脸关键点获取头部的朝向。

国际惯例,参考博客:

opencv:Camera Calibration and 3D Reconstruction

opencv:Real Time pose estimation of a textured object

cv.solvePnP位姿估计旋转向量精度分析

头部姿态估计原理及可视化

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

相机矩阵(Camera Matrix)

Python cv2.decomposeProjectionMatrix方法代码示例

face_landmark

head-pose-estimation

Face-Yaw-Roll-Pitch-from-Pose-Estimation-using-OpenCV

talking-head-anime-demo

OpenVtuber

相机标定理论

几种坐标系

先看从opencv官网中扒下来的两幅图,代表针孔相机模型(pinhole camera model)

其中涉及到几种坐标系:

  • 世界坐标系:一个固定不变的坐标系,原点通常固定不变,右图的 w w w坐标系
  • 相机坐标系:相机在世界坐标系下的姿态,右图的 c c c坐标系
  • 图像坐标系:成像平面,图中的x-y坐标轴,其原点是相机的光轴与成像平面的胶垫
  • 像素坐标系:最终图像,图中的u-v坐标轴,原点在左上角,就跟opencv输出的图片一样,左上角代表 ( 0 , 0 ) (0,0) (0,0)像素位置。

图像坐标系和像素坐标系横轴和纵轴方向一致,但是单位不同,一个是物理单位,一个是像素单位,一般有一个对应的缩放关系,代表一个像素在成像平面上的大小。

针孔相机的目标就是把3D坐标点 P w P_w Pw利用透视变换(perspective transformation)投影到图像平面上,得到对应像素 p p p。其中 P w P_w Pw p p p都在齐次坐标系下表示。

无畸变情况下,针孔相机的投影变换可以表示为:
s   p = A [ R ∣ t ] P w s\\ p=A[R|t]P_w s p=A[Rt]Pw
其中 P w P_w Pw为世界坐标系下的3D坐标点, p p p是图像平面上的2D像素点, A A A是相机内参矩阵, R R R t t t分别描述了世界坐标系到相机坐标系的旋转和平移变换, s s s是任意尺度的投影变换(非相机模型的参数,其实就是图像坐标系到像素坐标系的变换系数)。

世界坐标系到相机坐标系

旋转-平移矩阵 [ R ∣ t ] [R|t] [Rt]是投影变换(projective transformation)和齐次变换(homogeneous transformation)的乘积。

维度为 ( 3 , 4 ) (3,4) (3,4)投影变换可以将相机坐标系里的3D坐标映射到成像平面的2D坐标,并且在归一化的相机坐标系 x ′ = X c Z c x'=\\fracX_cZ_c x=ZcXc y ′ = Y c Z c y'=\\fracY_cZ_c y=ZcYc下表示出来
Z c [ x ′ y ′ 1 ] = [ 1 0 0 0 0 1 0 0 0 0 1 0 ] [ X c Y c Z c 1 ] Z_c\\beginbmatrix x'\\\\ y'\\\\1 \\endbmatrix=\\beginbmatrix 1&0&0&0\\\\ 0&1&0&0\\\\ 0&0&1&0 \\endbmatrix\\beginbmatrix X_c\\\\Y_c\\\\Z_c\\\\1 \\endbmatrix Zcxy1=100010001000XcYcZc1
而齐次变换通常在相机外参 R R R t t t中体现出来,代表世界坐标系到相机坐标系的变换,因此给定一个世界坐标系下的点 P w P_w Pw,那么相机坐标系下的对应点为:
P c = [ R t 0 1 ] P w P_c=\\beginbmatrix R&t\\\\0&1 \\endbmatrixP_w Pc=[R0t1]Pw
这个齐次变换一般就是由一个(3,3)的旋转矩阵和一个(3,1)的平移向量组成:
[ R t 0 1 ] = [ r 11 r 12 r 13 t x r 21 r 22 r 23 t y r 31 r 32 r 33 t z 0 0 0 1 ] \\beginbmatrix R&t\\\\0&1 \\endbmatrix=\\beginbmatrix r_11&r_12&r_13&t_x\\\\ r_21&r_22&r_23&t_y\\\\ r_31&r_32&r_33&t_z\\\\ 0&0&0&1 \\endbmatrix [R0t1]=r11r21r310r12r22r320r13r23r330txtytz1
因此
[ X c Y c Z c 1 ] = [ r 11 r 12 r 13 t x

以上是关于opencv相机标定和人头姿态估计案例的主要内容,如果未能解决你的问题,请参考以下文章

数字图像处理OpenCV相机标定 计算内参外参

数字图像处理OpenCV相机标定 计算内参外参

opencv相机标定(Python)

相机标定的内参、外参、畸变参数

计算机视觉——相机内外参、相机标定

相机标定中的一些知识点(小孔模型、鱼眼模型、畸变、泰勒展开)