多视图几何--密集匹配--视差平面推导
文章目录
- 方法1
- 视差平面推导
- 方法2
- 1. 问题设定
- 2. 左相机投影
- 3. 右相机投影
- 4. 视差定义
- 5. 将平面方程用图像坐标表示
- 6. 用视差 ddd 替换 ZZZ
- 7. 整理成 d=aul+bvl+cd = a u_l + b v_l + cd=aul+bvl+c 的形式
- 8. 最终视差平面公式
- 9. 说明
- 参数的几何意义
- 视差平面点法式与一般方程的转换
- 左右视差平面转换

方法1
视差平面推导
首先,切平面的数学表达式为:nTX+d=0n^T X+d=0nTX+d=0
推理过程如下:
nT(X−X0)=0,X0=−d⋅n⇓nTX−nTX0=0⇓nTX+nTn⋅d=0⇓nTX+d=0\begin{aligned} & n^T\left(X-X_0\right)=0, X_0=-d \cdot n \\ & \Downarrow \\ & n^T X-n^T X_0=0 \\ & \Downarrow \\ & n^T X+n^T n \cdot d=0 \\ & \Downarrow \\ & n^T X+d=0 \end{aligned} nT(X−X0)=0,X0=−d⋅n⇓nTX−nTX0=0⇓nTX+nTn⋅d=0⇓nTX+d=0
- XXX 是位于真实物体表面上的空间点(相机坐标系下)
- nnn 是切平面的法向量
- X0X_0X0 是位于切平面上的空间点(相机坐标系下)
- ppp 是 XXX 在成像平面的投影点(图像像素坐标系下)
- ddd 表示相机原点到切平面的法线距离
其次,空间点 XXX 和成像平面投影点 ppp 之间存在如下关系:
p=(1/z)⋅K⋅XX=z⋅K−1⋅p\begin{gathered} p=(1 / z) \cdot K \cdot X \\ X=z \cdot K^{-1} \cdot p \end{gathered} p=(1/z)⋅K⋅XX=z⋅K−1⋅p
其中,zzz 是空间点 XXX 的 zzz 轴坐标,即投影点 ppp 的深度
因此,我们可以推导出,由切平面和投影点 ppp 表示的深度 zzz :
{X=z⋅K−1⋅pnTX+d=0⇒z=−dnTK−1p\left\{\begin{array}{l} X=z \cdot K^{-1} \cdot p \\ n^T X+d=0 \end{array} \Rightarrow z=-\frac{d}{n^T K^{-1} p}\right. {X=z⋅K−1⋅pnTX+d=0⇒z=−nTK−1pd
由根据,双目几何结构中,视差和深度的对应关系:
z=B⋅fxdpz=\frac{B \cdot f_x}{d_p} z=dpB⋅fx
这里,BBB 表示双目基线长度,fxf_xfx 表示内参中的焦距,dpd_pdp 表示视差。
因此,我们可以得到,由投影点 ppp 表示的视差 dpd_pdp :
dp=−BfxdnTK−1p=afppx+bfppy+cfp,p=[px,py,1]Td_p=-\frac{B f_x}{d} n^T K^{-1} p=a_{f_p} p_x+b_{f_p} p_y+c_{f_p}, p=\left[p_x, p_y, 1\right]^T dp=−dBfxnTK−1p=afppx+bfppy+cfp,p=[px,py,1]T
其中,−BfxdnTK−1-\frac{B f_x}{d} n^T K^{-1}−dBfxnTK−1 可以由 afy,bfp,cfpa_{f_y}, b_{f_p}, c_{f_p}afy,bfp,cfp 这三个参数表示。
进一步展开−BfxdnTK−1-\frac{B f_x}{d} n^T K^{-1}−dBfxnTK−1 :
步骤1: 计算内参矩阵的逆K−1K^{-1}K−1
假设内参矩阵KKK为:
K=[fx0cx0fycy001]K = \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} K=fx000fy0cxcy1
则其逆矩阵K−1K^{-1}K−1为:
K−1=[1fx0−cxfx01fy−cyfy001]K^{-1} = \begin{bmatrix} \frac{1}{f_x} & 0 & -\frac{c_x}{f_x} \\ 0 & \frac{1}{f_y} & -\frac{c_y}{f_y} \\ 0 & 0 & 1 \end{bmatrix} K−1=fx1000fy10−fxcx−fycy1
步骤2: 计算K−1pK^{-1} pK−1p
给定p=[px,py,1]Tp = [p_x, p_y, 1]^Tp=[px,py,1]T,计算:
K−1p=[1fx0−cxfx01fy−cyfy001][pxpy1]=[px−cxfxpy−cyfy1]K^{-1} p = \begin{bmatrix} \frac{1}{f_x} & 0 & -\frac{c_x}{f_x} \\ 0 & \frac{1}{f_y} & -\frac{c_y}{f_y} \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} p_x \\ p_y \\ 1 \end{bmatrix} = \begin{bmatrix} \frac{p_x - c_x}{f_x} \\ \frac{p_y - c_y}{f_y} \\ 1 \end{bmatrix} K−1p=fx1000fy10−fxcx−fycy1pxpy1=fxpx−cxfypy−cy1
步骤3: 计算nTK−1pn^T K^{-1} pnTK−1p
给定n=[nx,ny,nz]Tn = [n_x, n_y, n_z]^Tn=[nx,ny,nz]T,计算:
nTK−1p=[nx,ny,nz][px−cxfxpy−cyfy1]=nxpx−cxfx+nypy−cyfy+nzn^T K^{-1} p = [n_x, n_y, n_z] \begin{bmatrix} \frac{p_x - c_x}{f_x} \\ \frac{p_y - c_y}{f_y} \\ 1 \end{bmatrix} = n_x \frac{p_x - c_x}{f_x} + n_y \frac{p_y - c_y}{f_y} + n_z nTK−1p=[nx,ny,nz]fxpx−cxfypy−cy1=nxfxpx−cx+nyfypy−cy+nz
步骤4: 代入视差公式
将nTK−1pn^T K^{-1} pnTK−1p代入视差公式:
dp=−Bfxd(nxpx−cxfx+nypy−cyfy+nz)d_p = -\frac{B f_x}{d} \left( n_x \frac{p_x - c_x}{f_x} + n_y \frac{p_y - c_y}{f_y} + n_z \right) dp=−dBfx(nxfxpx−cx+nyfypy−cy+nz)
步骤5: 展开并简化表达式
展开括号:
dp=−Bfxd⋅nxpx−cxfx−Bfxd⋅nypy−cyfy−Bfxd⋅nzd_p = -\frac{B f_x}{d} \cdot n_x \frac{p_x - c_x}{f_x} - \frac{B f_x}{d} \cdot n_y \frac{p_y - c_y}{f_y} - \frac{B f_x}{d} \cdot n_z dp=−dBfx⋅nxfxpx−cx−dBfx⋅nyfypy−cy−dBfx⋅nz
简化每一项:
dp=−Bnxd(px−cx)−Bfxnydfy(py−cy)−Bfxnzdd_p = -\frac{B n_x}{d} (p_x - c_x) - \frac{B f_x n_y}{d f_y} (p_y - c_y) - \frac{B f_x n_z}{d} dp=−dBnx(px−cx)−dfyBfxny(py−cy)−dBfxnz
步骤6: 进一步展开为pxp_xpx和pyp_ypy的线性形式
展开括号中的项:
dp=−Bnxdpx+Bnxcxd−Bfxnydfypy+Bfxnycydfy−Bfxnzdd_p = -\frac{B n_x}{d} p_x + \frac{B n_x c_x}{d} - \frac{B f_x n_y}{d f_y} p_y + \frac{B f_x n_y c_y}{d f_y} - \frac{B f_x n_z}{d} dp=−dBnxpx+dBnxcx−dfyBfxnypy+dfyBfxnycy−dBfxnz
合并常数项:
dp=(−Bnxd)px+(−Bfxnydfy)py+(Bnxcxd+Bfxnycydfy−Bfxnzd)d_p = \left( -\frac{B n_x}{d} \right) p_x + \left( -\frac{B f_x n_y}{d f_y} \right) p_y + \left( \frac{B n_x c_x}{d} + \frac{B f_x n_y c_y}{d f_y} - \frac{B f_x n_z}{d} \right) dp=(−dBnx)px+(−dfyBfxny)py+(dBnxcx+dfyBfxnycy−dBfxnz)
步骤7: 定义系数afp,bfp,cfpa_{f_p}, b_{f_p}, c_{f_p}afp,bfp,cfp
根据上式,令:
afp=−Bnxda_{f_p} = -\frac{B n_x}{d} afp=−dBnx
bfp=−Bfxnydfyb_{f_p} = -\frac{B f_x n_y}{d f_y} bfp=−dfyBfxny
cfp=Bnxcxd+Bfxnycydfy−Bfxnzdc_{f_p} = \frac{B n_x c_x}{d} + \frac{B f_x n_y c_y}{d f_y} - \frac{B f_x n_z}{d} cfp=dBnxcx+dfyBfxnycy−dBfxnz
最终视差平面公式
因此,视差平面公式可写为:
dp=afppx+bfppy+cfpd_p = a_{f_p} p_x + b_{f_p} p_y + c_{f_p} dp=afppx+bfppy+cfp
其中系数afp,bfp,cfpa_{f_p}, b_{f_p}, c_{f_p}afp,bfp,cfp由上述表达式定义。
方法2
1. 问题设定
投影模型:使用针孔相机模型,内参矩阵 KKK 为:
K=[fx0cx0fycy001]K = \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} K=fx000fy0cxcy1
其中 fx,fyf_x, f_yfx,fy 是焦距(像素单位),(cx,cy)(c_x, c_y)(cx,cy)$是主点。
左右相机:假设已进行立体校正,两相机光轴平行、x 轴对齐,只在 x 方向有平移 bbb(基线长度,单位为米)。
左相机坐标系 = 世界坐标系(方便起见)。
右相机相对于左相机位姿为:(R=I,T=[−b,0,0]T)(R = I, T = [-b, 0, 0]^T)(R=I,T=[−b,0,0]T)。
三维空间平面(在左相机坐标系下):
点法式表示:
n⋅P=d0\mathbf{n} \cdot \mathbf{P} = d_0 n⋅P=d0
其中 n=[nx,ny,nz]T\mathbf{n} = [n_x, n_y, n_z]^Tn=[nx,ny,nz]T 是平面法向量(单位向量),P=[X,Y,Z]T\mathbf{P} = [X, Y, Z]^TP=[X,Y,Z]T 是三维点,d0d_0d0 是原点到平面的有符号距离(米)。
2. 左相机投影
左相机内参矩阵 KKK,投影方程(齐次坐标):
pl=KP\mathbf{p}_l = K \mathbf{P} pl=KP
即:
[ulvl1]≡[fx0cx0fycy001][XYZ]\begin{bmatrix} u_l \\ v_l \\ 1 \end{bmatrix} \equiv \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} X \\ Y \\ Z \end{bmatrix} ulvl1≡fx000fy0cxcy1XYZ
所以:
ul=fxXZ+cx,vl=fyYZ+cyu_l = f_x \frac{X}{Z} + c_x, \quad v_l = f_y \frac{Y}{Z} + c_y ul=fxZX+cx,vl=fyZY+cy
或者反解:
X=Zul−cxfx,Y=Zvl−cyfyX = Z \frac{u_l - c_x}{f_x}, \quad Y = Z \frac{v_l - c_y}{f_y} X=Zfxul−cx,Y=Zfyvl−cy
3. 右相机投影
右相机坐标系中,同一个三维点 P=[X,Y,Z]T\mathbf{P} = [X, Y, Z]^TP=[X,Y,Z]T 的坐标为:
Pr=RP+T=P+[−b,0,0]T=[X−b,Y,Z]T\mathbf{P}_r = R \mathbf{P} + T = \mathbf{P} + [-b, 0, 0]^T = [X - b, Y, Z]^T Pr=RP+T=P+[−b,0,0]T=[X−b,Y,Z]T
右相机内参矩阵与左相机相同(已校正),所以:
ur=fxX−bZ+cx,vr=fyYZ+cyu_r = f_x \frac{X - b}{Z} + c_x, \quad v_r = f_y \frac{Y}{Z} + c_y ur=fxZX−b+cx,vr=fyZY+cy
注意 vr=vlv_r = v_lvr=vl(已校正条件下)。
4. 视差定义
视差:
d=ul−urd = u_l - u_r d=ul−ur
代入:
d=[fxXZ+cx]−[fxX−bZ+cx]=fxbZd = \left[ f_x \frac{X}{Z} + c_x \right] - \left[ f_x \frac{X - b}{Z} + c_x \right] = \frac{f_x b}{Z} d=[fxZX+cx]−[fxZX−b+cx]=Zfxb
这是已知的视差-深度关系。
5. 将平面方程用图像坐标表示
平面方程:
nxX+nyY+nzZ=d0n_x X + n_y Y + n_z Z = d_0 nxX+nyY+nzZ=d0
代入 X=Zul−cxfxX = Z \frac{u_l - c_x}{f_x}X=Zfxul−cx,Y=Zvl−cyfyY = Z \frac{v_l - c_y}{f_y}Y=Zfyvl−cy:
nxZul−cxfx+nyZvl−cyfy+nzZ=d0n_x Z \frac{u_l - c_x}{f_x} + n_y Z \frac{v_l - c_y}{f_y} + n_z Z = d_0 nxZfxul−cx+nyZfyvl−cy+nzZ=d0
两边除以 ZZZ:
nxul−cxfx+nyvl−cyfy+nz=d0Zn_x \frac{u_l - c_x}{f_x} + n_y \frac{v_l - c_y}{f_y} + n_z = \frac{d_0}{Z} nxfxul−cx+nyfyvl−cy+nz=Zd0
6. 用视差 ddd 替换 ZZZ
由 d=fxbZd = \frac{f_x b}{Z}d=Zfxb 得:
1Z=dfxb\frac{1}{Z} = \frac{d}{f_x b} Z1=fxbd
代入平面方程:
nxul−cxfx+nyvl−cyfy+nz=d0fxbdn_x \frac{u_l - c_x}{f_x} + n_y \frac{v_l - c_y}{f_y} + n_z = \frac{d_0}{f_x b} d nxfxul−cx+nyfyvl−cy+nz=fxbd0d
7. 整理成 d=aul+bvl+cd = a u_l + b v_l + cd=aul+bvl+c 的形式
记 u=ulu = u_lu=ul,v=vlv = v_lv=vl。
上式乘以 fxf_xfx:
nx(u−cx)+nyfxfy(v−cy)+nzfx=d0bdn_x (u - c_x) + n_y \frac{f_x}{f_y} (v - c_y) + n_z f_x = \frac{d_0}{b} dnx(u−cx)+nyfyfx(v−cy)+nzfx=bd0d
设 α=fxfy\alpha = \frac{f_x}{f_y}α=fyfx(像素纵横比倒数,如果fx=fyf_x = f_yfx=fy 则 α=1\alpha=1α=1)。
于是:
nxu+nyα(v−cy)+nx(−cx)+nzfx=d0bdn_x u + n_y \alpha (v - c_y) + n_x (-c_x) + n_z f_x = \frac{d_0}{b} d nxu+nyα(v−cy)+nx(−cx)+nzfx=bd0d
即:
d0bd=nxu+αnyv+[−nxcx−αnycy+nzfx]\frac{d_0}{b} d = n_x u + \alpha n_y v + \big[ -n_x c_x - \alpha n_y c_y + n_z f_x \big] bd0d=nxu+αnyv+[−nxcx−αnycy+nzfx]
因此:
d=bd0nxu+bd0αnyv+bd0[−nxcx−αnycy+nzfx]d = \frac{b}{d_0} n_x u + \frac{b}{d_0} \alpha n_y v + \frac{b}{d_0} \big[ -n_x c_x - \alpha n_y c_y + n_z f_x \big] d=d0bnxu+d0bαnyv+d0b[−nxcx−αnycy+nzfx]
8. 最终视差平面公式
令:
ap=bd0nxa_p = \frac{b}{d_0} n_x ap=d0bnx
bp=bd0αnyb_p = \frac{b}{d_0} \alpha n_y bp=d0bαny
cp=bd0[−nxcx−αnycy+nzfx]c_p = \frac{b}{d_0} \big[ -n_x c_x - \alpha n_y c_y + n_z f_x \big] cp=d0b[−nxcx−αnycy+nzfx]
则:d(u,v)=apu+bpv+cpd(u, v) = a_p u + b_p v + c_pd(u,v)=apu+bpv+cp
其中 d(u,v)d(u, v)d(u,v) 是像素坐标 (u,v)(u, v)(u,v) 处的视差。
9. 说明
- 在立体匹配中,每个分割的超像素或窗口可以拟合一个视差平面 d=apu+bpv+cpd = a_p u + b_p v + c_pd=apu+bpv+cp。
- 这里的 ap,bp,cpa_p, b_p, c_pap,bp,cp 与三维空间平面参数 (nx,ny,nz,d0)(n_x, n_y, n_z, d_0)(nx,ny,nz,d0) 及相机内参、基线有关。
- 如果平面是 fronto-parallel(nx=0,ny=0,nz=1n_x=0, n_y=0, n_z=1nx=0,ny=0,nz=1),则 ap=0,bp=0a_p=0, b_p=0ap=0,bp=0,d(u,v)=bfxd0d(u,v) = \frac{b f_x}{d_0}d(u,v)=d0bfx 常数,即视差图是平的。
最终公式:
d(u,v)=apu+bpv+cp\boxed{d(u,v) = a_p u + b_p v + c_p} d(u,v)=apu+bpv+cp
其中系数与平面法向量、内参、基线的关系如上所示。
参数的几何意义
- 参数 a和 b:
- a:表示视差沿图像水平方向的变化率
- b:表示视差沿图像垂直方向的变化率
- 这两个参数直接反映了3D平面的法向量在图像域的投影
- 参数 c:
- 表示当 (px,py)=(0,0)时的视差值(考虑主点偏移后的参考视差)
- 特殊情况:
- 当 a=b=0a=b=0 时,视差平面退化为常数,对应于fronto-parallel平面(正对相机的平面)
- 当 nx=ny=0 时,平面平行于图像平面,视差恒定
视差平面点法式与一般方程的转换
视差平面可以由法向量和平面上的某点表示:
nT(X−X0)=nT[x−x0y−y0z−z0]=0n^T\left(X-X_0\right)=n^T\left[\begin{array}{l} x-x_0 \\ y-y_0 \\ z-z_0 \end{array}\right]=0 nT(X−X0)=nTx−x0y−y0z−z0=0
其中,nnn 表示视差平面的法向量,X=[x,y,z]TX=[x, y, z]^TX=[x,y,z]T 是视差平面的任意点,X0=[x0,y0,z0]TX_0=\left[x_0, y_0, z_0\right]^TX0=[x0,y0,z0]T 是视差平面的某点。
点加法向量方程转换为通用参数方程:
af=−nxnz,bf=−nynz,cf=nxx0+nyy0+nzz0nza_f=-\frac{n_x}{n_z}, b_f=-\frac{n_y}{n_z}, c_f=\frac{n_x x_0+n_y y_0+n_z z_0}{n_z} af=−nznx,bf=−nzny,cf=nznxx0+nyy0+nzz0
推导过程如下:
nT[x−x0y−y0z−z0]=0⇓nx(x−x0)+ny(y−y0)+nz(z−z0)=0⇓z=−nznzx−nynzy+nxx0+nyy0+nzz0nz\begin{aligned} & n^T\left[\begin{array}{l} x-x_0 \\ y-y_0 \\ z-z_0 \end{array}\right]=0 \\ & \Downarrow \\ & n_x\left(x-x_0\right)+n_y\left(y-y_0\right)+n_z\left(z-z_0\right)=0 \\ & \Downarrow \\ & z=-\frac{n_z}{n_z} x-\frac{n_y}{n_z} y+\frac{n_x x_0+n_y y_0+n_z z_0}{n_z} \end{aligned} nTx−x0y−y0z−z0=0⇓nx(x−x0)+ny(y−y0)+nz(z−z0)=0⇓z=−nznzx−nznyy+nznxx0+nyy0+nzz0
通用参数方程转换为点加法向量方程:
nx=afaf2+bf2+1,ny=bfaf2+bf2+1,nz=−1af2+bf2+1z0=afx0+bfy0+cf\begin{gathered} n_x=\frac{a_f}{\sqrt{a_f^2+b_f^2+1}}, n_y=\frac{b_f}{\sqrt{a_f^2+b_f^2+1}}, n_z=\frac{-1}{\sqrt{a_f^2+b_f^2+1}} \\ z_0=a_f x_0+b_f y_0+c_f \end{gathered} nx=af2+bf2+1af,ny=af2+bf2+1bf,nz=af2+bf2+1−1z0=afx0+bfy0+cf
左右视差平面转换
这里需要补充说明,如何从将左视图的视差平面转换为右视图的视差平面:
首先,我们有左视图的视差平面:
dl=apxl+bpyl+cpd_l=a_p x_l+b_p y_l+c_p dl=apxl+bpyl+cp
由于,xr=xl−dl,yr=ylx_r=x_l-d_l, y_r=y_lxr=xl−dl,yr=yl ,我们可得,
dl=ap(xr+dl)+bpyr+cp⇓dl=apxr+apdl+bpyr+cp⇓(1−ap)dl=apxr+bpyr+cp⇓dl=ap1−apxr+bp1−apyr+cp1−ap\begin{gathered} d_l=a_p\left(x_r+d_l\right)+b_p y_r+c_p \\ \Downarrow \\ d_l=a_p x_r+a_p d_l+b_p y_r+c_p \\ \Downarrow \\ \left(1-a_p\right) d_l=a_p x_r+b_p y_r+c_p \\ \Downarrow \\ d_l=\frac{a_p}{1-a_p} x_r+\frac{b_p}{1-a_p} y_r+\frac{c_p}{1-a_p} \end{gathered} dl=ap(xr+dl)+bpyr+cp⇓dl=apxr+apdl+bpyr+cp⇓(1−ap)dl=apxr+bpyr+cp⇓dl=1−apapxr+1−apbpyr+1−apcp
由于,dr=−dld_r=-d_ldr=−dl ,即 xl=xr−drx_l=x_r-d_rxl=xr−dr ,左右视图匹配点的视差值是互为相反数,则:
dr=apap−1xr+bpap−1yr+cpap−1d_r=\frac{a_p}{a_p-1} x_r+\frac{b_p}{a_p-1} y_r+\frac{c_p}{a_p-1} dr=ap−1apxr+ap−1bpyr+ap−1cp
从而,我们得到右视图的视差平面表达式。