参考:《计算机视觉中的多视图几何》第二版的第8章;通义千问
一、问题设定
-
相机模型:针孔模型和鱼眼模型均可以将图像坐标转换到归一化平面,因此接下来只在归一化平面上探讨。
-
球体 :真实世界中的一个球,半径为 R R R,球心为 C ∈ R 3 C \in \mathbb{R}^3 C∈R3(未知)。
-
图像观测 :球体在归一化平面上的投影是一个椭圆(一般情况),其参数(中心、长短轴、方向)可以从归一化平面中拟合得到。
-
目标:
- 求球心 C C C 在归一化平面平上的投影点 p c = ( u c , v c ) ⊤ p_c = (u_c, v_c)^\top pc=(uc,vc)⊤。需要注意的是这个投影点 不等于 投影椭圆的几何中心!且与球的真实半径无关。
- 求球心 C C C(球心在相机坐标系中的位置)。
二、几何背景:球体投影为椭圆
在针孔相机下,空间中的球体投影到归一化平面是一个二次曲线 ,具体为一个椭圆(若整个球可见)。
设球心在相机坐标系下的位置为 C = X , Y , Z ⊤ \mathbf{C} = X, Y, Z^\top C=X,Y,Z⊤,半径为 R R R。
球面方程(相机坐标系):
( X ′ − X ) 2 + ( Y ′ − Y ) 2 + ( Z ′ − Z ) 2 = R 2 (X' - X)^2 + (Y' - Y)^2 + (Z' - Z)^2 = R^2 (X′−X)2+(Y′−Y)2+(Z′−Z)2=R2
X ′ 、 Y ′ 、 Z ′ X'、Y'、Z' X′、Y′、Z′ 为球面上的任一点。
三、构造切锥的二次型
考虑从光心 O = ( 0 , 0 , 0 ) O = (0,0,0) O=(0,0,0) 出发经过归一化平面上的点 d = x , y , 1 ⊤ \mathbf{d} = x, y, 1^\top d=x,y,1⊤(非齐次方向向量)的任意射线方向。该射线上点可写为 λ d , λ > 0 \lambda \mathbf{d}, \lambda > 0 λd,λ>0。
此射线与球相切 ⇔ 方程
∥ λ d − C ∥ 2 = R 2 \|\lambda \mathbf{d} - \mathbf{C}\|^2 = R^2 ∥λd−C∥2=R2
有唯一解 (判别式为零, b 2 − 4 a c = 0 b^2 - 4 a c = 0 b2−4ac=0)。
展开:
λ 2 ∥ d ∥ 2 − 2 λ ( d ⊤ C ) + ∥ C ∥ 2 − R 2 = 0 \lambda^2 \|\mathbf{d}\|^2 - 2\lambda (\mathbf{d}^\top \mathbf{C}) + \|\mathbf{C}\|^2 - R^2 = 0 λ2∥d∥2−2λ(d⊤C)+∥C∥2−R2=0
判别式为零:
2 d ⊤ C 2 − 4 ∥ d ∥ 2 ( ∥ C ∥ 2 − R 2 ) = 0 2 \\mathbf{d}\^\\top \\mathbf{C}^2 - 4 \|\mathbf{d}\|^2 (\|\mathbf{C}\|^2 - R^2) = 0 2d⊤C2−4∥d∥2(∥C∥2−R2)=0
化简得:
( d ⊤ C ) 2 = ∥ d ∥ 2 ( ∥ C ∥ 2 − R 2 ) (\mathbf{d}^\top \mathbf{C})^2 = \|\mathbf{d}\|^2 (\|\mathbf{C}\|^2 - R^2) (d⊤C)2=∥d∥2(∥C∥2−R2)
移项:
( d ⊤ C ) 2 − ( ∥ C ∥ 2 − R 2 ) ∥ d ∥ 2 = 0 (\mathbf{d}^\top \mathbf{C})^2 - (\|\mathbf{C}\|^2 - R^2) \|\mathbf{d}\|^2 = 0 (d⊤C)2−(∥C∥2−R2)∥d∥2=0
用矩阵形式表达(注意 ∥ d ∥ 2 = d ⊤ I d \|\mathbf{d}\|^2 = \mathbf{d}^\top I \mathbf{d} ∥d∥2=d⊤Id, ( d ⊤ C ) 2 = d ⊤ ( C C ⊤ ) d (\mathbf{d}^\top \mathbf{C})^2 = \mathbf{d}^\top (\mathbf{C} \mathbf{C}^\top) \mathbf{d} (d⊤C)2=d⊤(CC⊤)d):
d ⊤ C C ⊤ − ( ∥ C ∥ 2 − R 2 ) I d = 0 \mathbf{d}^\top \left \\mathbf{C} \\mathbf{C}\^\\top - (\\\|\\mathbf{C}\\\|\^2 - R\^2) I \\right \mathbf{d} = 0 d⊤CC⊤−(∥C∥2−R2)Id=0
定义 切锥在方向空间中的二次型矩阵:
Q dir = C C ⊤ − ( ∥ C ∥ 2 − R 2 ) I Q_{\text{dir}} = \mathbf{C} \mathbf{C}^\top - (\|\mathbf{C}\|^2 - R^2) I Qdir=CC⊤−(∥C∥2−R2)I
那么所有切线方向 d \mathbf{d} d 满足:
d ⊤ Q dir d = 0 \mathbf{d}^\top Q_{\text{dir}} \mathbf{d} = 0 d⊤Qdird=0
注意:这是在三维方向空间中的二次锥面方程。对椭圆不熟悉,可以查看最后面的补充知识
四、归一化平面的投影椭圆
在归一化平面,该轮廓对应一个椭圆,其齐次方程为:
x ⊤ Q x = 0 \mathbf{x}^\top Q \mathbf{x} = 0 x⊤Qx=0
其中 Q Q Q 是归一化平面中的二次曲线矩阵(3×3 对称,秩3)。
根据 x ⊤ Q x = 0 \mathbf{x}^\top Q \mathbf{x} = 0 x⊤Qx=0 和 d ⊤ Q dir d = 0 \mathbf{d}^\top Q_{\text{dir}} \mathbf{d} = 0 d⊤Qdird=0 ,两个都是齐次方程,乘一个非零系数仍然成立,所以:
Q = λ Q dir = λ ( C C ⊤ − ( ∥ C ∥ 2 − R 2 ) I ) Q = \lambda Q_{\text{dir}} = \lambda( \mathbf{C} \mathbf{C}^\top - (\|\mathbf{C}\|^2 - R^2) I) Q=λQdir=λ(CC⊤−(∥C∥2−R2)I)
因此,如果我们能将图像中轮廓计算到归一化平面,再拟合出椭圆对应的 Q Q Q,就可以求解上述的公式。
需要注意的是:
d ⊤ C C ⊤ − ( ∥ C ∥ 2 − R 2 ) I d = 0 ⇒ Q = C C ⊤ − ( ∥ C ∥ 2 − R 2 ) I \mathbf{d}^\top \\mathbf{C} \\mathbf{C}\^\\top - (\\\|\\mathbf{C}\\\|\^2 - R\^2) I \mathbf{d} = 0 \Rightarrow Q = \mathbf{C} \mathbf{C}^\top - (\|\mathbf{C}\|^2 - R^2) I d⊤CC⊤−(∥C∥2−R2)Id=0⇒Q=CC⊤−(∥C∥2−R2)I
在 Hartley & Zisserman 和多数文献中,习惯将二次曲线写成:
q ⊤ Q q = 0 \mathbf{q}^\top Q \mathbf{q} = 0 q⊤Qq=0
且 Q dir Q_{\text{dir}} Qdir 通常取为负定或不定。为了匹配标准形式,我们两边乘以 -1(不影响零集):
Q : = λ ( ( ∥ C ∥ 2 − R 2 ) I − C C ⊤ ) (1) Q := \lambda ((\|\mathbf{C}\|^2 - R^2) I - \mathbf{C} \mathbf{C}^\top) \tag{1} Q:=λ((∥C∥2−R2)I−CC⊤)(1)
✅ 这就是归一化平面上球体投影椭圆的二次曲线矩阵!
五、方程求解
这里存在两个求解方式:线性方程组求解和特征向量法求解。实测的话特征向量法求解更稳定,精度更高。
1. 线性方程组求解
忽略公式(1)的展开过程,直接给出其分量表示:
Q = a 11 a 12 a 13 a 12 a 22 a 23 a 13 a 23 a 33 = λ x c 2 − s x c y c x c x c y c y c 2 − s y c x c y c 1 − s Q = \begin{bmatrix} a_{11} & a_{12} & a_{13} \\ a_{12} & a_{22} & a_{23} \\ a_{13} & a_{23} & a_{33} \end{bmatrix} = \lambda \begin{bmatrix} x_c^2 - s & x_c y_c & x_c \\ x_c y_c & y_c^2 - s & y_c \\ x_c & y_c & 1 - s \end{bmatrix} Q= a11a12a13a12a22a23a13a23a33 =λ xc2−sxcycxcxcycyc2−sycxcyc1−s
于是得到六个独立方程(对称):
a 11 = λ ( x c 2 − s ) ( 2 ) a 22 = λ ( y c 2 − s ) ( 3 ) a 33 = λ ( 1 − s ) ( 4 ) a 12 = λ x c y c ( 5 ) a 13 = λ x c ( 6 ) a 23 = λ y c ( 7 ) \begin{aligned} a_{11} &= \lambda (x_c^2 - s) \quad &(2)\\ a_{22} &= \lambda (y_c^2 - s) \quad &(3)\\ a_{33} &= \lambda (1 - s) \quad &(4)\\ a_{12} &= \lambda x_c y_c \quad &(5)\\ a_{13} &= \lambda x_c \quad &(6)\\ a_{23} &= \lambda y_c \quad &(7) \end{aligned} a11a22a33a12a13a23=λ(xc2−s)=λ(yc2−s)=λ(1−s)=λxcyc=λxc=λyc(2)(3)(4)(5)(6)(7)
其中 x c , y c x_c, y_c xc,yc(即球心投影的归一化坐标轴),而 λ , s \lambda, s λ,s 是辅助未知数(其中 s = x c 2 + y c 2 + 1 − ρ 2 s = x_c^2 + y_c^2 + 1 - \rho^2 s=xc2+yc2+1−ρ2), x c = X Z , y c = Y Z , ρ = R Z x_c = \frac{X}{Z}, \quad y_c = \frac{Y}{Z}, \quad \rho = \frac{R}{Z} xc=ZX,yc=ZY,ρ=ZR。
观测公式(5)、(6)(7),可以轻松求解出球心在归一化平面的投影点。事实上,我实践中尝试过,这样做不好,只考虑了三个约束条件,受椭圆拟合的精度影响大,数值不稳定。未利用全部信息,考虑六个约束条件的话,容易得到:
a 11 − a 33 a 12 a 12 a 22 − a 33 \] \[ x c y c \] = − \[ a 13 a 23 \] \\begin{bmatrix} a_{11} - a_{33} \& a_{12} \\\\ a_{12} \& a_{22} - a_{33} \\end{bmatrix} \\begin{bmatrix} x_c \\\\ y_c \\end{bmatrix} = - \\begin{bmatrix} a_{13} \\\\ a_{23} \\end{bmatrix} \[a11−a33a12a12a22−a33\]\[xcyc\]=−\[a13a23
这个方程:
- 利用了全部6个矩阵元素;
- 是线性的,可直接求解;
- 对中心附近的球体更稳定;
2. 特征向量法求解
公式 Q = λ ( ( ∥ C ∥ 2 − R 2 ) I − C C ⊤ ) Q = \lambda ((\|\mathbf{C}\|^2 - R^2) I - \mathbf{C} \mathbf{C}^\top) Q=λ((∥C∥2−R2)I−CC⊤)是一个经典的秩-1更新的单位矩阵 ,其特征值和特征向量有明确解析解。(秩-1更新的单位矩阵介绍参考我的另一篇博客:矩阵秩-1更新:)
令:
- a = λ ( ∥ C ∥ 2 − R 2 ) a = \lambda (\|\mathbf{C}\|^2 - R^2) a=λ(∥C∥2−R2)(因为球必须在相机前方且可见,故 ∥ C ∥ > R \|\mathbf{C}\| > R ∥C∥>R,因为椭圆性质,其系数A和C大于0,易得此处 λ > 0 \lambda > 0 λ>0)
- u = λ C \mathbf{u} = \sqrt {\lambda} \mathbf{C} u=λ C
则:
Q = a I − u u ⊤ Q = a I - \mathbf{u} \mathbf{u}^\top Q=aI−uu⊤
特征值分析:
- 方向 u \mathbf{u} u(即球心方向) :
Q u = ( a I − u u ⊤ ) u = a u − ( u ⊤ u ) u = a u − ∥ u ∥ 2 u = ( a − ∥ u ∥ 2 ) u Q \mathbf{u} = (a I - \mathbf{u} \mathbf{u}^\top) \mathbf{u} = a \mathbf{u} - (\mathbf{u}^\top \mathbf{u}) \mathbf{u} = a \mathbf{u} - \|\mathbf{u}\|^2 \mathbf{u} = (a - \|\mathbf{u}\|^2) \mathbf{u} Qu=(aI−uu⊤)u=au−(u⊤u)u=au−∥u∥2u=(a−∥u∥2)u
注意到:
a = ∥ u ∥ 2 − λ R 2 ⇒ a − ∥ u ∥ 2 = − λ R 2 a = \|\mathbf{u}\|^2 - \lambda R^2 \Rightarrow a - \|\mathbf{u}\|^2 = -\lambda R^2 a=∥u∥2−λR2⇒a−∥u∥2=−λR2
所以:
Q u = − λ R 2 u Q \mathbf{u} = -\lambda R^2 \mathbf{u} Qu=−λR2u
⇒ u = λ C \mathbf{u} = \sqrt {\lambda} \mathbf{C} u=λ C 是 Q Q Q 的特征向量,对应特征值 λ 1 = − λ R 2 \lambda_1 = -\lambda R^2 λ1=−λR2。
其他特征值:
- λ 2 = λ 3 = λ ( ∥ C ∥ 2 − R 2 ) > 0 \lambda_2 = \lambda_3 = \lambda (\|\mathbf{C}\|^2 - R^2) >0 λ2=λ3=λ(∥C∥2−R2)>0(根据秩-1更新的单位矩阵推导)
因此,最小特征值是 − λ R 2 < 0 -\lambda R^2 < 0 −λR2<0 ,其对应的特征向量方向就是 λ C \sqrt {\lambda} \mathbf{C} λ C(球心在相机坐标系中的位置向量)。
六、从特征向量恢复球心投影点
特征向量 λ C \sqrt {\lambda} \mathbf{C} λ C 与 C = X , Y , Z ⊤ \mathbf{C} = X, Y, Z^\top C=X,Y,Z⊤ 同方向(相差一个正比例因子)。
只需将特征向量归一化使得第三分量为 1,即可得球心在归一化平面的投影为:
q c = u 1 u 3 , u 2 u 3 , 1 ⊤ \mathbf{q}_c = \left \\frac{u_1}{u_3}, \\frac{u_2}{u_3}, 1 \\right^\top qc=u3u1,u3u2,1⊤
对于球心的位置则是:
根据半径 R R R,求比例因子 λ \lambda λ:
λ = − λ 1 R 2 \lambda = \frac{-\lambda_1}{R^2} λ=R2−λ1
球心在相机坐标系下的模长为:
∥ C ∥ = λ 2 + λ 3 2 λ + R 2 \|\mathbf{C}\| = \sqrt{ \frac{\lambda_2 + \lambda_3}{2 \lambda} + R^2 } ∥C∥=2λλ2+λ3+R2
对特征向量 u \mathbf{u} u做归一化使其模长为1再乘 ∥ C ∥ \|\mathbf{C}\| ∥C∥,即可得球心在相机坐标系下的位置向量:
C = ∥ C ∥ u ∥ u ∥ \mathbf{C} = \|\mathbf{C}\| \frac{\mathbf{u}}{\|\mathbf{u}\|} C=∥C∥∥u∥u
七、几何直观解释
- 球的投影轮廓是由切线射线构成的锥面。
- 这个锥面关于球心-光心连线旋转对称。
- 因此,该锥面的"轴线"就是向量 C \mathbf{C} C。
- 二次曲面 Q Q Q 描述了这个锥面在归一化平面上的截痕。
- 而二次型矩阵 Q Q Q 的主轴方向由其特征向量决定。
- 由于锥面沿 C \mathbf{C} C 方向"最窄"(甚至在极限下收缩为一条线,当 R → 0 R \to 0 R→0),该方向对应最小的曲率 ,在代数上体现为最小(最负)的特征值。
待研究:
椭圆拟合的误差对球心位置的影响
八、补充知识:
1. 一般二次曲线的矩阵形式
在二维平面中,任意一条二次曲线都可以写成如下形式:
A x 2 + B x y + C y 2 + D x + E y + F = 0 Ax^2 + Bxy + Cy^2 + Dx + Ey + F = 0 Ax2+Bxy+Cy2+Dx+Ey+F=0
这可以写成齐次坐标下的矩阵形式:
x y 1 A B 2 D 2 B 2 C E 2 D 2 E 2 F x y 1 = 0 \begin{bmatrix} x & y & 1 \end{bmatrix} \begin{bmatrix} A & \frac{B}{2} & \frac{D}{2} \\ \frac{B}{2} & C & \frac{E}{2} \\ \frac{D}{2} & \frac{E}{2} & F \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} = 0 xy1 A2B2D2BC2E2D2EF xy1 =0
这个中间的 3 × 3 3 \times 3 3×3 矩阵(记作 Q Q Q)是一个实对称矩阵 ,它完整地编码了该二次曲线的信息。 Q Q Q乘任意的非零常数,仍然表达同一条二次曲线。
2. 如何判断是否为椭圆?
给定上述矩阵 Q Q Q,可以通过分析其对应的二次项子矩阵 (即左上角的 2 × 2 2\times2 2×2 块)来判断曲线类型:
令:
M = A B 2 B 2 C M = \begin{bmatrix} A & \frac{B}{2} \\ \frac{B}{2} & C \end{bmatrix} M=A2B2BC
- 如果 det ( M ) > 0 \det(M) > 0 det(M)>0 且 A A A 与 C C C 同号(通常取正),那么该二次曲线是椭圆(或点椭圆、虚椭圆,需进一步判断常数项)。
- 更严谨地,在非退化情况下(即整个 3 × 3 3\times3 3×3 矩阵的行列式 det ( Q ) ≠ 0 \det(Q) \ne 0 det(Q)=0),若 det ( M ) > 0 \det(M) > 0 det(M)>0,则为椭圆。