球体投影为椭圆的几何原理与求解方法

参考:《计算机视觉中的多视图几何》第二版的第8章;通义千问

一、问题设定

  • 相机模型:针孔模型和鱼眼模型均可以将图像坐标转换到归一化平面,因此接下来只在归一化平面上探讨。

  • 球体 :真实世界中的一个球,半径为 R R R,球心为 C ∈ R 3 C \in \mathbb{R}^3 C∈R3(未知)。

  • 图像观测 :球体在归一化平面上的投影是一个椭圆(一般情况),其参数(中心、长短轴、方向)可以从归一化平面中拟合得到。

  • 目标

    1. 求球心 C C C 在归一化平面平上的投影点 p c = ( u c , v c ) ⊤ p_c = (u_c, v_c)^\top pc=(uc,vc)⊤。需要注意的是这个投影点 不等于 投影椭圆的几何中心!且与球的真实半径无关。
    2. 求球心 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⊤C\]2−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)I\]d=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)I\]d=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⊤

特征值分析:
  1. 方向 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,则为椭圆。
相关推荐
埃科光电4 天前
应用分享丨破解3C行业反光与弱缺陷检测难题
图像处理·数码相机·计算机视觉·制造·相机
故事不长丨8 天前
安卓相机开发:Camera、Camera2与CameraX的使用对比及选型指南
android·相机·camera·camerax·camera2·移动设备·相机开发
memmolo10 天前
【3D视觉中的相机模型详解】
计算机视觉·3d·相机
PegasusYu11 天前
STM32校准读取激光测距传感器VL53L0X距离数据
stm32·测距·stm32cubeide·激光测距·vl53l0x·飞行时间·stm32g031f8
给算法爸爸上香18 天前
通用多相机多线程采图框架
多线程·相机·采图框架
社会零时工23 天前
【ROS2】海康相机ROS2设备服务节点开发
linux·c++·相机·ros2
PiaoShiSun24 天前
索尼Sony R3拍摄文件命名
相机·索尼·sony·文件命名
summerkissyou19871 个月前
Android-Camera-为啥不移到packages/module
android·相机
码界奇点1 个月前
Python与OpenCV集成海康威视工业相机从基础配置到高级应用的全方位指南
python·数码相机·opencv·相机·python3.11