张正友标定法原理简述

张氏标定内参

https://blog.csdn.net/tiantangzixue/article/details/79878996

参考文章

概述简述

张氏标定法需要不同角度的棋盘格进行采集数据

  1. 本质上是获得图像平面棋盘格平面Homography矩阵
  2. 假定棋盘格平面z方向等于0,因此这个homography矩阵是一个2D-2D的矩阵
  3. 所利用的约束是旋转矩阵所拥有的约束, 一个是列向量正交性,一个是单位向量性
  4. 每一张棋盘格提供两个约束,最后可以构建一整个的最小二乘问题进行求解.

## 标识

二维点\(\mathbf{m}=[u, v]^{T}\), 三维点表示为\(\mathbf{M}=[X, Y, Z]^{T}\). 在这里使用添加上标~来表示齐次坐标,所以二维和三维的坐标可以表示为\(\tilde{\mathbf{m}}=[u, v, 1]^{T}\)以及\(\widetilde{\mathbf{M}}=[X, Y, Z, 1]^{T}\). 对于一个针孔相机的模型,其成像模型如下所示: \[ s \tilde{\mathbf{m}}=\mathbf{A}[\mathbf{R} \quad \mathbf{t}] \widetilde{\mathbf{M}}, \quad \text { with } \mathbf{A}=\left[\begin{array}{ccc} \alpha & \gamma & u_{0} \\ 0 & \beta & v_{0} \\ 0 & 0 & 1 \end{array}\right] \] 其中\(s\)是scale的因子, \((\mathbf{R}, \mathbf{t})\)是外参数, \(\mathbf{A}\)是相机的内参矩阵, \(\left(u_{0}, v_{0}\right)\)也就是我们通常意义上的cx和cy, \(\alpha\)\(\beta\)就是fx和fy,\(\gamma\) 则是代表了两个轴之间的夹角情况.这里使用简写\(\mathbf{A}^{-T}\)来代表\(\mathbf{({A}^{-1})}^{T}\)

相机平面和标定板之间的Homography

首先先假定,在棋盘格平面,这个平面的Z方向上是0,同时设定为世界坐标系

不妨令Rotaion矩阵第i列列向量为\(\mathbf{r}_{i}\),那么相机投影的方程为: \[ s\left[\begin{array}{l} u \\ v \\ 1 \end{array}\right]=\mathbf{A}\left[\begin{array}{llll} \mathbf{r}_{1} & \mathbf{r}_{2} & \mathbf{r}_{3} & \mathbf{t} \end{array}\right]\left[\begin{array}{c} X \\ Y \\ 0 \\ 1 \end{array}\right]=\mathbf{A}\left[\begin{array}{lll} \mathbf{r}_{1} & \mathbf{r}_{2} & \mathbf{t} \end{array}\right]\left[\begin{array}{l} X \\ Y \\ 1 \end{array}\right] \] 接下来使用\(\mathbf{M}\)来表示一个在标定板平面上的点, \(\mathbf{M}=[X, Y]^{T}\),因为Z永远等于零,所以两个平面之间的Homography矩阵可以表示为 \[ s \tilde{\mathbf{m}}=\mathbf{H} \widetilde{\mathbf{M}} \quad \text { with } \quad \mathbf{H}=\mathbf{A}\left[\begin{array}{lll} \mathbf{r}_{1} & \mathbf{r}_{2} & \mathbf{t}] . \end{array}\right. \] 在一个s未确定的情况下,H可以进行确定

内参数存在的约束

不妨也使用列向量的方式对Homography矩阵进行一个表示.\(\mathbf{H}=\left[\begin{array}{lll}\mathbf{h}_{1} & \mathbf{h}_{2} & \mathbf{h}_{3}\end{array}\right]\) , 那么H阵可以表示为 \[ \left[\begin{array}{lll} \mathbf{h}_{1} & \mathbf{h}_{2} & \mathbf{h}_{3} \end{array}\right]=\lambda \mathbf{A}\left[\begin{array}{rrr} \mathbf{r}_{1} & \mathbf{r}_{2} & \mathbf{t} \end{array}\right] \] 其中\(\lambda\)就是s的倒数. 这里就要使用旋转矩阵的性质来构建约束

旋转矩阵的性质

旋转矩阵的性质:旋转矩阵是正交矩阵

  • 行列式为1
  • 各行是单位向量且两两正交
  • 各列是单位向量且两两正交[1]
  • 逆 = 转置

由“各列是单位向量且两两正交”可得(\(r_1\), \(r_2\)为旋转矩阵的第1列、第2列) : \[ \begin{array}{c} r_{1}^{T} r_{2}=0 \\ r_{1}^{T} r_{1}=r_{2}^{T} r_{2}=1 \end{array} \] 通过这两个公式就可以得到关于H矩阵的两个约束

约束的推导

通过式子 \[ \left[\begin{array}{lll}\mathbf{h}_{1} & \mathbf{h}_{2} & \mathbf{h}_{3}\end{array}\right]=\lambda \mathbf{A}\left[\begin{array}{rrr}\mathbf{r}_{1} & \mathbf{r}_{2} & \mathbf{t}\end{array}\right] \] 可以得到 \[ \begin{array}{l} \left\{\begin{array}{l} h_{1}=\lambda A r_{1} \\ h_{2}=\lambda A r_{2} \\ h_{3}=\lambda A t \end{array}\right. \\ \left\{\begin{array}{l} r_{1}=\frac{1}{\lambda} A^{-1} h_{1} \\ r_{2}=\frac{1}{\lambda} A^{-1} h_{2} \\ t=\frac{1}{\lambda} A^{-1} h_{3} \end{array}\right. \end{array} \]

带入之前旋转矩阵构建得到的两个约束中有 \[ \left\{\begin{array}{l} r_{1}^{T} r_{2}=\left(\frac{1}{\lambda} A^{-1} h_{1}\right)^{T}\left(\frac{1}{\lambda} A^{-1} h_{2}\right)=0 \\ r_{1}^{T} r_{1}=\left(\frac{1}{\lambda} A^{-1} h_{1}\right)^{T}\left(\frac{1}{\lambda} A^{-1} h_{1}\right)=r_{2}^{T} r_{2}=\left(\frac{1}{\lambda} A^{-1} h_{2}\right)^{T}\left(\frac{1}{\lambda} A^{-1} h_{2}\right)=1 \end{array}\right. \] 整理可以得到 \[ \begin{array}{c} h_{1}^{T} A^{-T} A^{-1} h_{2}=0 \\ h_{1}^{T} A^{-T} A^{-1} h_{1}=h_{2}^{T} A^{-T} A^{-1} h_{2} \end{array} \] 这也就是论文中所得到的两个约束的由来.

一次标定可以获得两个约束,通过多次的标定可以构建得到一个最小二乘的问题,进行求解可以得到在未知scale情况下的各个内参参数

具体的scale则需要了解棋盘格的具体尺寸.