数学中线性空间的线性变换换是什么意思啊?

主要介绍如何采用 OpenCV 和 Dlib 库,实现图片中人头部姿态估计.

在很多场景中,需要知道人头部相对于相机的倾斜程度. 例如,在 VR 领域,可以采用头部姿态来渲染场景的视角. 在辅助驾驶系统中,对准司机脸部的相机,可以根据头部姿态估计,判断司机是否注意力集中. 此外,还可以采用给予手势的头部姿态来控制 hands-free 应用(或游戏). 例如,将头部从左到有扭转,可以表示 NO. 但,如果是在印度南部,这个信号表示 YES.

本文作者认为,头部姿态估计是很有应用价值的.

1. 什么是姿态估计?

在 CV 领域中,物体的姿态是其相对于相机的方向(orientation)和位置(position). 通过移动物体相对于相机的位置,或者移动相机相对于物体的位置,即可改变物体的姿态.

这里所描述的姿态估计问题通常是 Perspective-n-Point (PNP) 问题,其旨在,对于标定相机(calibrated camera),找出物体的姿态;其中,已知物体的 n 个 3D 点,以及其在图片中所对应的 2D 投影.

对于一个标定好的摄像机,根据目标在 3D 世界坐标系中 n 个点的坐标和对应投影到 2D 图像坐标系中的点集之间的变换关系矩阵进行求解.

3D 刚体仅有两种相对于相机的运动:

关于 X, Y 和 Z 轴,旋转相机. 因此,旋转 也有三个自由度.

因此,3D 物体的姿态估计,即是计算 6 个变量 - 三个平移和三个旋转.

3. 姿态估计所需信息

为了计算图片中物体的 3D 姿态,需要知道一下信息:

这里采用的人脸关键点有:鼻尖,下巴,左眼的左角,右眼的右角,左嘴角,右嘴角.

同时还需要 2D 特征点对应的 3D 位置.

可能首先会想到,需要获取图片中人体的 3D 模型,才能得到 3D 位置. 而,实际上,是不需要的. 通用 3D 模型即可.

如何获取头部的 3D 模型呢? 实际上不需要 完整的 3D 模型,只需要任意坐标系中一些点的 3D 位置. 这里采用如下的 3D 点:

要注意的是,这些点是在任意坐标系统的. 即世界坐标系(World Coordinates).

正如上面所述,这里需要首先进行. 即,需要知道相机的焦距(focal

进行相机参数估计时首先需要对相机进行标定,精确的相机标定需要使用张正友的棋盘格标定,这里还是进行近似.

相机的内参数矩阵需要设定相机的焦距、图像的中心位置并且假设不存在径向畸变. 这里设置相机焦距为图像的宽度(以像素为单位),图像中心位置为(image.width/2,image.height/2).

4. 姿态估计算法原理

姿态估计有很多常用算法,最早的算法可以追溯到 1841 年. 这里不涉及到这些算法细节的解释,只是利用其思想.

这里需要用到三个坐标系统. 人脸特征的 3D 坐标是以世界坐标系进行表示的,如果旋转和平移是已知的(例如,pose),那么可以将世界坐标(world coordinates)中的 3D 点转换到相机坐标系(camera coordinates)中的 3D 点. 然后,采用相机的内在参数(焦距、光学中心等),将相机坐标系中的 3D 点再投影到图像平面(如,图像坐标系).

下面将图像成像公式分解,以理解上面的坐标系统的工作原理. 如上图中,$o$ 是相机中心,图中的平面即为图像平面. 目的是,找出 3D 点 $P$ 到图像平面的投影 $p$ 的等式.

如果具备线性代数知识,可以看出上述等式中,如果变量数(如,$(X, Y, Z)$ 和 $(U, V, W)$ )已知的足够多,该等式是线性系统的等式. 其中,$r_{ij}$ 和 $(t_x, t_y, t_z)$ 是未知的,是可以求解未知量.

下一章节中会涉及到的,只有 $(X, Y, Z)$ 是已知的,因此该等式不是简单的线性系统问题.

如果存在径向畸变,则会变得复杂一些. 不过这里先跳过.

公式中的 $s$ 是未知的缩放因子. 其在公式中的原因是,在任何图片中深度(depth)都是未知的. 如果将点 $P$ 的 3D 坐标加入到相机的的中心 $o$,则,点 $p$ 是射线 $oP$ 与图像平面的交点. 沿着射线的加入到相机中心和点 $P$ 的所有点,产生相同的图像. 换句话说,采用等式(3),只能得到 $(X, Y, Z)$,最多还能得到尺度 $s$.

这就会使得等式 (2) 变得复杂. 且更类似于:

幸运的是,等式(4) 还是可以采用 方法进行求解的. DLT 方法可以用于求解等式接近与线性系统,但又包含未知尺度因子的等式问题.

DLT 方法可能是不够精确的,其主要原因是:

[1] - 旋转 $\mathbf{R}$ 包含三个自由度,但 DLT 算法中的矩阵表示要采用 9 个数字. 并没有限制该估计的 3x3 矩阵必须为旋转矩阵.

[2] - 更重要的是,DLT 方法并不是对正确的目标函数进行最小化. 理想情况下,想要最小化的是重投影误差(reprojection error).

另外还知道 2D 人脸特征点(可以采用 Dlib 库或手工选取). 则可以计算投影的 3D 点和 2D 人脸特征点之间的距离. 如果估计的人脸姿态是很完美的,则 3D 点投影到图像平面,会与 2D 人脸特征点高度重合(line up). 如果估计的人脸姿态不够好,则需要计算重投影误差,其计算的是投影的 3D 点和 2D 人脸特征点之间的平方差距离.

$\mathbf{t}$,以寻找更好的姿态估计. 虽然该方案有效,但速度会非常慢. 实践证明, $\mathbf{R}$ 和 $\mathbf{t}$ 迭代改变的有几种主要方式,以使得重投影误差衰减,这种方式被成为 optimization. 详细细节可参考 .

其中,$f_x$ 和 $f_y$ 可以采用图像的宽度进行逼近,$c_x$ 和 $c_y$ 可以是图像中心的坐标.

人脸特征点的位置是硬编码的,如果需要使用自定义的图片,需要修改 image_points 向量.

}

我要回帖

更多关于 线性空间的线性变换 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信