光流法的三维运动表示
Reference:
- 高翔,张涛 《视觉SLAM十四讲》
- GILAD ADIV Determining Three-Dimensional Motion and Structurefrom Optical Flow Generated by Several Moving Objects
1. 简介
光流是一种描述像素随时间在图像之间运动的方法。计算部分像素运动的方法称为稀疏光流;计算所有像素的称为稠密光流。稀疏光流以 Lucas-Kanade 光流为代表,稠密光流以 Horn-Schunck 光流为代表。本文中主要使用到了 LK 光流。
Lucas-Kanade 光流
单像素算法
在 LK 光流中,我们认为来自相机的图像是随时间变化的。图像可以看作时间的函数:
I
(
t
)
I(t)
I(t)。那么,一个在
t
t
t 时刻,位于
(
x
,
y
)
(x,y)
(x,y) 处的像素,它的灰度可以写成:
I
(
x
,
y
,
t
)
I(x,y,t)
I(x,y,t)
光流法的基本假设:
灰度不变假设:同一个空间点的像素灰度值,在各个图像中是固定不变的。
对于
t
t
t 时刻位于
(
x
,
y
)
(x,y)
(x,y) 处的像素,我们设
t
+
d
t
t + dt
t+dt 时刻,它运动到
(
x
+
d
x
,
y
+
d
y
)
(x + dx, y + dy)
(x+dx,y+dy) 处。由于灰度不变,有:
I
(
x
+
d
x
,
y
+
d
y
,
t
+
d
t
)
=
I
(
x
,
y
,
t
)
\boldsymbol{I}(x+\mathrm{d} x, y+\mathrm{d} y, t+\mathrm{d} t)=\boldsymbol{I}(x, y, t)
I(x+dx,y+dy,t+dt)=I(x,y,t)
对左边进行泰勒展开,保留一阶项,得:
I
(
x
+
d
x
,
y
+
d
y
,
t
+
d
t
)
≈
I
(
x
,
y
,
t
)
+
∂
I
∂
x
d
x
+
∂
I
∂
y
d
y
+
∂
I
∂
t
d
t
\boldsymbol{I}(x+\mathrm{d} x, y+\mathrm{d} y, t+\mathrm{d} t) \approx \boldsymbol{I}(x, y, t)+\frac{\partial \boldsymbol{I}}{\partial x} \mathrm{d} x+\frac{\partial \boldsymbol{I}}{\partial y} \mathrm{d} y+\frac{\partial \boldsymbol{I}}{\partial t} \mathrm{d} t
I(x+dx,y+dy,t+dt)≈I(x,y,t)+∂x∂Idx+∂y∂Idy+∂t∂Idt
因为假设了灰度不变,于是下一个时刻的灰度等于之前的灰度,从而:
∂
I
∂
x
d
x
+
∂
I
∂
y
d
y
+
∂
I
∂
t
d
t
=
0
\frac{\partial \boldsymbol{I}}{\partial x} \mathrm{d} x+\frac{\partial \boldsymbol{I}}{\partial y} \mathrm{d} y+\frac{\partial \boldsymbol{I}}{\partial t} \mathrm{d} t = 0
∂x∂Idx+∂y∂Idy+∂t∂Idt=0
两边除以
d
t
dt
dt,得:
∂
I
∂
x
d
x
+
∂
I
∂
y
d
y
=
−
∂
I
∂
t
d
t
\frac{\partial \boldsymbol{I}}{\partial x} \mathrm{d} x+\frac{\partial \boldsymbol{I}}{\partial y} \mathrm{d} y= -\frac{\partial \boldsymbol{I}}{\partial t} \mathrm{d} t
∂x∂Idx+∂y∂Idy=−∂t∂Idt
其中
d
x
/
d
t
dx/dt
dx/dt 为像素在
x
x
x 轴上运动速度,而
d
y
/
d
t
dy/dt
dy/dt 为
y
y
y 轴速度,把它们记为
u
u
u,
v
v
v。同
时
∂
I
/
∂
x
\partial I/\partial x
∂I/∂x 为图像在该点处
x
x
x 方向的梯度,另一项则是在
y
y
y 方向的梯度,记为
I
x
,
I
y
I_x, I_y
Ix,Iy。把图像灰度对时间的变化量记为
I
t
I_t
It,写成矩阵形式,有:
[
I
x
I
y
]
[
u
v
]
=
−
I
t
\left[\begin{array}{ll} \boldsymbol{I}_{x} & \boldsymbol{I}_{y} \end{array}\right]\left[\begin{array}{l} u \\ v \end{array}\right]=-\boldsymbol{I}_{t}
[IxIy][uv]=−It
最小二乘获得运动轨迹
我们想计算的是像素的运动 u; v,但是该式是带有两个变量的一次方程,仅凭它无法
计算出
u
,
v
u,v
u,v。因此,必须引入额外的约束来计算
u
,
v
u, v
u,v。在 LK 光流中,我们假设某一个窗口内的像素具有相同的运动(注意是窗口,并不是整张图)。
考虑一个大小为
w
×
w
w × w
w×w 大小的窗口,它含有
w
2
w^2
w2 数量的像素。由于该窗口内像素具有
同样的运动,因此我们共有
w
2
w^2
w2 个方程:
[
I
x
I
y
]
k
[
u
v
]
=
−
I
t
k
,
k
=
1
,
…
,
w
2
\left[\begin{array}{ll} \boldsymbol{I}_{x} & \boldsymbol{I}_{y} \end{array}\right]_{k}\left[\begin{array}{l} u \\ v \end{array}\right]=-\boldsymbol{I}_{t k}, \quad k=1, \ldots, w^{2}
[IxIy]k[uv]=−Itk,k=1,…,w2
记:
A
=
[
[
I
x
,
I
y
]
1
⋮
[
I
x
,
I
y
]
k
]
,
b
=
[
I
t
1
⋮
I
t
k
]
\boldsymbol{A}=\left[\begin{array}{c} {\left[\boldsymbol{I}_{x}, \boldsymbol{I}_{y}\right]_{1}} \\ \vdots \\ {\left[\boldsymbol{I}_{x}, \boldsymbol{I}_{y}\right]_{k}} \end{array}\right], \boldsymbol{b}=\left[\begin{array}{c} \boldsymbol{I}_{t 1} \\ \vdots \\ \boldsymbol{I}_{t k} \end{array}\right]
A=⎣⎢⎡[Ix,Iy]1⋮[Ix,Iy]k⎦⎥⎤,b=⎣⎢⎡It1⋮Itk⎦⎥⎤
于是整个方程为:
A
[
u
v
]
=
−
b
\boldsymbol{A}\left[\begin{array}{l} u \\ v \end{array}\right]=-\boldsymbol{b}
A[uv]=−b
这是一个关于 u; v 的超定线性方程,传统解法是求最小二乘解。最小二乘在很多时候
都用到过:
[
u
v
]
∗
=
−
(
A
T
A
)
−
1
A
T
b
\left[\begin{array}{l} u \\ v \end{array}\right]^{*}=-\left(\boldsymbol{A}^{T} \boldsymbol{A}\right)^{-1} \boldsymbol{A}^{T} \boldsymbol{b}
[uv]∗=−(ATA)−1ATb
2. 三维运动表示
假设图像特征点 p p p 的路标为 P ( X , Y , Z ) P(X,Y,Z) P(X,Y,Z),它的图像点坐标是 ( x , y ) (x,y) (x,y),它的光流向量是 ( u , v ) (u,v) (u,v)。相机有一个三维的移动,它的光心为 O O O,它的坐标轴为 X c , Y c , Z c X_c,Y_c,Z_c Xc,Yc,Zc,它的图像平面为 x c , y c x_c,y_c xc,yc。路标 P P P 位于图像平面的前面,它相对于相机的移动可以被分解成旋转移动 ω ⃗ = ( A , B , C ) T \vec{\omega}=(A, B, C)^{\mathrm{T}} ω=(A,B,C)T 和位移移动 T ⃗ = ( U , V , W ) T \vec{T}=(U, V, W)^{\mathrm{T}} T=(U,V,W)T。
令
P
′
P'
P′ 为在时间
t
′
t'
t′ 上所对应的坐标系,对应关系可得:
(
X
′
Y
′
Z
′
)
=
R
(
X
Y
Z
)
+
T
\left(\begin{array}{l} X^{\prime} \\ Y^{\prime} \\ Z^{\prime} \end{array}\right)=R\left(\begin{array}{l} X \\ Y \\ Z \end{array}\right)+T
⎝⎛X′Y′Z′⎠⎞=R⎝⎛XYZ⎠⎞+T
此时的旋转矩阵可以被估计,假设旋转参数的值较小,
R
=
(
1
−
C
B
C
1
−
A
−
B
A
1
)
R=\left(\begin{array}{ccc} 1 & -C & B \\ C & 1 & -A \\ -B & A & 1 \end{array}\right)
R=⎝⎛1C−B−C1AB−A1⎠⎞
综合上式,可得
X
′
X'
X′,
Y
′
Y'
Y′, 和
Z
′
Z'
Z′(注意,此时的图像已经矫正过了)
x
′
=
X
′
Z
′
=
x
−
C
y
+
B
+
U
/
Z
−
B
x
+
A
y
+
1
+
W
/
Z
x^{\prime}=\frac{X^{\prime}}{Z^{\prime}}=\frac{x-C y+B+U / Z}{-B x+A y+1+W / Z}
x′=Z′X′=−Bx+Ay+1+W/Zx−Cy+B+U/Z
y ′ = Y ′ Z ′ = C x + y − A + V / Z − B x + A y + 1 + W / Z y^{\prime}=\frac{Y^{\prime}}{Z^{\prime}}=\frac{C x+y-A+V / Z}{-B x+A y+1+W/ Z} y′=Z′Y′=−Bx+Ay+1+W/ZCx+y−A+V/Z
已知位移向量
(
u
=
x
′
−
x
,
v
=
y
′
−
y
)
(u=x'-x,v=y'-y)
(u=x′−x,v=y′−y),因此通过上面两式可以得到:
u
=
−
A
x
y
+
B
(
1
+
x
2
)
−
C
y
+
(
U
−
W
x
)
/
Z
1
+
A
y
−
B
x
+
W
/
Z
u=\frac{-A x y+B\left(1+x^{2}\right)-C y+\left(U-W x\right) / Z}{1+A y-B x+W / Z}
u=1+Ay−Bx+W/Z−Axy+B(1+x2)−Cy+(U−Wx)/Z
v = − A ( 1 + y 2 ) + B x y + C x + ( V − W y ) / Z 1 + A y − B x + W / Z v=\frac{-A\left(1+y^{2}\right)+B x y+C x+\left(V-Wy\right) / Z}{1+A y-B x+W/ Z} v=1+Ay−Bx+W/Z−A(1+y2)+Bxy+Cx+(V−Wy)/Z
如果 ∣ W / Z ∣ < < 1 |W/Z|<<1 ∣W/Z∣<<1 且相机的视场不是很大,且旋转参数小,我们可以将分母近似为1。
因此图像三维运动的参考光流向量可以表示为:
{
u
=
X
˙
Z
−
X
Z
˙
Z
2
=
(
U
Z
+
B
−
C
y
)
−
x
(
W
Z
+
A
y
−
B
x
)
v
=
Y
˙
Z
−
Y
Z
˙
Z
2
=
(
V
Z
+
C
x
−
A
)
−
y
(
W
Z
+
A
y
−
B
x
)
\left\{\begin{array}{l} u=\frac{\dot{X}}{Z}-\frac{X \dot{Z}}{Z^{2}}=\left(\frac{U}{Z}+B-C y\right)-x\left(\frac{W}{Z}+A y-B x\right) \\ v=\frac{\dot{Y}}{Z}-\frac{Y \dot{Z}}{Z^{2}}=\left(\frac{V}{Z}+C x-A\right)-y\left(\frac{W}{Z}+A y-B x\right) \end{array}\right.
{u=ZX˙−Z2XZ˙=(ZU+B−Cy)−x(ZW+Ay−Bx)v=ZY˙−Z2YZ˙=(ZV+Cx−A)−y(ZW+Ay−Bx)
其中,
X
˙
=
U
+
B
Z
−
C
Y
,
Y
˙
=
V
+
C
X
−
A
Z
,
Z
˙
=
W
+
A
Y
−
B
X
\quad \dot{X}=U+B Z-C Y, \quad \dot{Y}=V+C X-A Z, \quad \dot{Z}=W+A Y-B X
X˙=U+BZ−CY,Y˙=V+CX−AZ,Z˙=W+AY−BX