🍊作者简介:秃头小苏 ,致力于用最通俗的语言描述问题
🍊专栏推荐:深度学习网络原理与实战
🍊近期目标:写好专栏的每一篇文章
🍊支持小苏:点赞👍🏼、收藏⭐、留言📩
双目视觉系统
写在前面
Hello,大家好,我是小苏🧒🏽🧒🏽🧒🏽
在之前的文章中已经为大家介绍了计算机视觉领域的各种深度学习模型,但他们往往都是单目相机拍摄的图片,没有深度信息。那么这里我给大家介绍一些不一样的,即双目视觉,它可以获取物体的深度信息。🍋🍋🍋
其实啊,双目视觉在我们日常生活中用的也是挺广泛的,像我们耳熟能详的自动驾驶汽车基本都配备了双目相机,当然了,绝大多数自动驾驶汽车还用到了其它像毫米波雷达、激光雷达等传感器。🌼🌼🌼但双目相机绝对是自动驾驶不可或缺的一部分。🍀🍀🍀
那么双目视觉相机到底是如何获取物体深度信息的,以及双目中非常重要的四系坐标转化是如何实现的呢?这节就让我来带领大家一起来看看叭~~~🥂🥂🥂
注:大家不要看下面全是公式就没有耐心看下去,其实你沉下心来慢慢的阅读,还是比较容易看懂的。而且这一部分是非常重要的,在做多传感器融合的时候也会用到四系坐标转换的知识,总之,大家感兴趣的一定要有耐心,有恒心,相信你理解后会有很大的收获。
另外,想要入门双目视觉的,也可以去我主页搜“双目”,了解更多双目视觉的知识。
相机模型与几何关系推导
首先来看一下相机的焦距 f \mathrm{f} f , 如图: f \mathrm{f} f 即为 p \mathrm{p} p 所在平面和 O \mathrm{O} O 所在平面的距离。
接下来我们看下面的双目相机, 两个相机固定在同一直线上, 以其为一个基 准定为 X \mathrm{X} X 轴。 L \mathrm{L} L 为相机的成像平面, 则 x \mathrm{x} x 轴和 L \mathrm{L} L 之前的距离就为焦距 f \mathrm{f} f 。外有一点 P(x, z), P C 1 交 L 于 D 1, P C 2 交 L 于 D2。【图中三条水平线是平行的】, 我们可以利 用三角形相似的知识推导一些公式:
可以看出 O ′ D O^{\prime} D O ′ D 平行 T P \mathrm{TP} TP , 所以 △ T O P \triangle T O P △ TOP 相似于 △ O ′ O D 1 \triangle O^{\prime} O D_{1} △ O ′ O D 1 , 则
△ T O P ∼ △ O ′ O D 1 ⇒ x x l = z f \triangle T O P \sim \triangle O^{\prime} O D_{1} \Rightarrow \frac{x}{x_{l}}=\frac{z}{f} \quad △ TOP ∼ △ O ′ O D 1 ⇒ x l x = f z --1>
同理可得:
Δ C 2 E P ∼ Δ C 2 G D 2 ⇒ x − b x r = z f \Delta C_{2} E P \sim \Delta C_{2} G D_{2} \Rightarrow \frac{x-b}{x_{r}}=\frac{z}{f} \quad Δ C 2 EP ∼ Δ C 2 G D 2 ⇒ x r x − b = f z --2>
由 1>, 2> 得
{ x l = x z ⋅ f x r = x − b z ⋅ f \left\{\begin{array}{c}
x_{l}=\frac{x}{z} \cdot f \\
x_{r}=\frac{x-b}{z} \cdot f
\end{array}\right. { x l = z x ⋅ f x r = z x − b ⋅ f
这里定义视差 d i f f = x l − x r = ( x z − x − b z ) ⋅ f = b z ⋅ f d i f f=x_{l}-x_{r}=\left(\frac{x}{z}-\frac{x-b}{z}\right) \cdot f=\frac{b}{z} \cdot f d i ff = x l − x r = ( z x − z x − b ) ⋅ f = z b ⋅ f
则 z = b ⋅ f d i f f z=\frac{b \cdot f}{d i f f} z = d i ff b ⋅ f
四系坐标转换
图像坐标系 (Image coordinate system) ——像素坐标系 (Pixel coordinate system)
首先需要明确的是像素坐标系的单位是 pix, 而图像坐标系的单位是 mm。如 下图所示, 其表示一个图像, 假设其长和宽都为 20 m m 20 \mathrm{~mm} 20 mm ,每个小方格长为 4 m m 4 \mathrm{~mm} 4 mm , 宽 为 10 m m 10 \mathrm{~mm} 10 mm , 那么在横向该图像一共有 20 4 = 5 \frac{20}{4}=5 4 20 = 5 个小方格, 在纵向一个有 20 10 = 2 \frac{20}{10}=2 10 20 = 2 个小方 格; 进一步的, 如果小方格很小, 其长为 d x \mathrm{dx} dx , 宽为 d y \mathrm{dy} dy , 则在横向该图像一共有 20 d x \frac{20}{d x} d x 20 个 小方格, 在纵向一个有 20 d y \frac{20}{d y} d y 20 个小方格。那么在这个 20 × 20 20 \times 20 20 × 20 的图像中, 我们就说该图 像横向有 20 d x \frac{20}{d x} d x 20 个像素, 纵向有 20 d y \frac{20}{d y} d y 20 个像素。
言归正传, 进行图像坐标系到像素坐标系的转换。图中图像坐标系中的点 (x \mathrm{x} x , y \mathrm{y} y ) 对应于像素坐标系中的点 (u, v) 。其中图像坐标系的原点坐标为 O 2 ( u 0 , v 0 ) O_{2}\left(u_{0}, v_{0}\right) O 2 ( u 0 , v 0 ) 。不难 看出, 他们之前的关系如下:
u = x d x + u 0 − − 3 > v = y d y + v 0 − − 4 > \begin{array}{ll}
u=\frac{x}{d x}+u_{0} & --3> \\
v=\frac{y}{d y}+v_{0} & --4>
\end{array} u = d x x + u 0 v = d y y + v 0 − − 3 > − − 4 >
将上述 3>,4>式整理为矩阵形式如下:
[ u v 1 ] = [ 1 d x 0 u 0 0 1 d y v 0 0 0 1 ] [ x y 1 ] − − ① \left[\begin{array}{l}
u \\
v \\
1
\end{array}\right]=\left[\begin{array}{ccc}
\frac{1}{d x} & 0 & u_{0} \\
0 & \frac{1}{d y} & v_{0} \\
0 & 0 & 1
\end{array}\right]\left[\begin{array}{l}
x \\
y \\
1
\end{array}\right] \quad--① ⎣ ⎡ u v 1 ⎦ ⎤ = ⎣ ⎡ d x 1 0 0 0 d y 1 0 u 0 v 0 1 ⎦ ⎤ ⎣ ⎡ x y 1 ⎦ ⎤ − − ①
相机坐标系 (camera coordinate system)—ー图像坐标系 (Image coordinate system)
如图所示, 蓝色平面为成像平面, 其所在坐标系为成像坐标系, O c Oc O c 为相机, X c Y c Z c O c X c Y c Z c O c X c Y c Z c O c 为相机坐标系。 P ( X c , Y c , Z c ) P(X c, Y c, Z c) P ( X c , Y c , Z c ) 为相机坐标系中一点, P ′ ( x , y ) P^{\prime}(x, y) P ′ ( x , y ) 为蓝色平面上一 点, 我们可以根据相似关系推导出一些公式:
Δ P ′ O c B ⇒ Z c y = P O c P ′ O c = A O c B O c − − 5 > \Delta P^{\prime O_{c}} B \Rightarrow \frac{Z_{c}}{y}=\frac{P O_{c}}{P^{\prime O_{c}}}=\frac{A O_{c}}{B O_{c}} \quad \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ --5> Δ P ′ O c B ⇒ y Z c = P ′ O c P O c = B O c A O c − − 5 >
Δ P O c C ∼ Δ P ′ O c E ⇒ X c x = P O c P ′ O c = C O c E O c − − 6 > \Delta P O_{c} C \sim \Delta P^{\prime O_{c}} E \Rightarrow \frac{X_{c}}{x}=\frac{P O_{c}}{P^{\prime O_{c}}}=\frac{C O_{c}}{E O_{c}} \quad--6> Δ P O c C ∼ Δ P ′ O c E ⇒ x X c = P ′ O c P O c = E O c C O c − − 6 >
Δ D O c C ∼ Δ O 2 O c E ⇒ Y c y = Z c f = C O c E O c − − 7 > \Delta D O_{c} C \sim \Delta O_{2} O_{c} E \Rightarrow \frac{Y_{c}}{y}=\frac{Z_{c}}{f}=\frac{C O_{c}}{E O_{c}} \quad \ \ --7> Δ D O c C ∼ Δ O 2 O c E ⇒ y Y c = f Z c = E O c C O c − − 7 >
由 5>, 6>, 7> 得:
y = Y c Z c ⋅ f − − 8 > y=\frac{Y_{c}}{Z_{c}} \cdot f \quad--8> y = Z c Y c ⋅ f − − 8 >
x = X c Z c ⋅ f − − 9 > x=\frac{X_{c}}{Z_{c}} \cdot f \quad--9> x = Z c X c ⋅ f − − 9 >
将 8>, 9> 整理成矩阵形式:
Z c [ x y 1 ] = [ f 0 0 0 0 f 0 0 0 0 1 0 ] [ X c Y c Z c 1 ] − − ② Z_{c}\left[\begin{array}{l}
x \\
y \\
1
\end{array}\right]=\left[\begin{array}{llll}
f & 0 & 0 & 0 \\
0 & f & 0 & 0 \\
0 & 0 & 1 & 0
\end{array}\right]\left[\begin{array}{c}
X_{c} \\
Y_{c} \\
Z_{c} \\
1
\end{array}\right]--② Z c ⎣ ⎡ x y 1 ⎦ ⎤ = ⎣ ⎡ f 0 0 0 f 0 0 0 1 0 0 0 ⎦ ⎤ ⎣ ⎡ X c Y c Z c 1 ⎦ ⎤ − − ②
综合(1)(2)可得:
[ u v 1 ] = 1 Z c [ 1 d x 0 u 0 0 1 d y v 0 0 0 1 ] [ f 0 0 0 0 f 0 0 0 0 1 0 ] [ X c Y c Z c 1 ] − − I \left[\begin{array}{l}
u \\
v \\
1
\end{array}\right]=\frac{1}{Z_{c}}\left[\begin{array}{ccc}
\frac{1}{d x} & 0 & u_{0} \\
0 & \frac{1}{d y} & v_{0} \\
0 & 0 & 1
\end{array}\right]\left[\begin{array}{cccc}
f & 0 & 0 & 0 \\
0 & f & 0 & 0 \\
0 & 0 & 1 & 0
\end{array}\right]\left[\begin{array}{c}
X_{c} \\
Y_{c} \\
Z_{c} \\
1
\end{array}\right] \quad--I ⎣ ⎡ u v 1 ⎦ ⎤ = Z c 1 ⎣ ⎡ d x 1 0 0 0 d y 1 0 u 0 v 0 1 ⎦ ⎤ ⎣ ⎡ f 0 0 0 f 0 0 0 1 0 0 0 ⎦ ⎤ ⎣ ⎡ X c Y c Z c 1 ⎦ ⎤ − − I
世界坐标系 (world coordinate system) ——相机坐标系 (camera coordinate system)
刚体变换可以理解为物体体积不发生变化, 可以进行旋转和平移。
1、旋转
下图为点 ( x , y ) (x, y) ( x , y ) 经过旋转得到点 ( x ∗ , y ∗ ) \left(x^{*}, y^{*}\right) ( x ∗ , y ∗ ) 的示意图。可以发现, 图中点的 Z 坐标没有变化, 即该旋转是在平面上绕 Z \mathrm{Z} Z 轴旋转得到的, 我们可以根据旋转角度 θ \theta θ 来确定旋转前后的坐标关系:【推导可查旋转后坐标公式】
{ x ∗ = x cos θ − y sin θ y ∗ = x sin θ + y cos θ z ∗ = z ∗ 1 \left\{ \begin{array}{l}
{{\rm{x}}^*} = x\cos \theta - y\sin \theta \\
{y^*} = x\sin \theta + y\cos \theta \\
{z^*} = z*1
\end{array} \right. ⎩ ⎨ ⎧ x ∗ = x cos θ − y sin θ y ∗ = x sin θ + y cos θ z ∗ = z ∗ 1
上式是绕 Z 轴旋转得到的公式, 将其写成矩阵形式:
[ x ∗ y ∗ z ∗ ] = [ cos θ − sin θ 0 sin θ − cos θ 0 0 0 1 ] [ x y z ] = R 1 [ x y z ] − − 10 > \left[\begin{array}{l}
x^{*} \\
y^{*} \\
z^{*}
\end{array}\right]=\left[\begin{array}{ccc}
\cos \theta & -\sin \theta & 0 \\
\sin \theta & -\cos \theta & 0 \\
0 & 0 & 1
\end{array}\right]\left[\begin{array}{l}
x \\
y \\
z
\end{array}\right]=R_{1}\left[\begin{array}{l}
x \\
y \\
z
\end{array}\right] \quad--10> ⎣ ⎡ x ∗ y ∗ z ∗ ⎦ ⎤ = ⎣ ⎡ cos θ sin θ 0 − sin θ − cos θ 0 0 0 1 ⎦ ⎤ ⎣ ⎡ x y z ⎦ ⎤ = R 1 ⎣ ⎡ x y z ⎦ ⎤ − − 10 >
同理可得绕 y y y 轴旋转的坐标关系 ( ϕ \phi ϕ 为旋转角)
[ x ∗ y ∗ z ∗ ] = [ cos ϕ 0 − sin ϕ 0 1 0 sin ϕ 0 cos ϕ ] [ x y z ] = R 2 [ x y z ] − − 11 > \left[\begin{array}{l}
x^{*} \\
y^{*} \\
z^{*}
\end{array}\right]=\left[\begin{array}{ccc}
\cos \phi & 0 & -\sin \phi \\
0 & 1 & 0 \\
\sin \phi & 0 & \cos \phi
\end{array}\right]\left[\begin{array}{l}
x \\
y \\
z
\end{array}\right]=R_{2}\left[\begin{array}{l}
x \\
y \\
z
\end{array}\right] \quad--11> ⎣ ⎡ x ∗ y ∗ z ∗ ⎦ ⎤ = ⎣ ⎡ cos ϕ 0 sin ϕ 0 1 0 − sin ϕ 0 cos ϕ ⎦ ⎤ ⎣ ⎡ x y z ⎦ ⎤ = R 2 ⎣ ⎡ x y z ⎦ ⎤ − − 11 >
同理可得绕 x 轴旋转的坐标关系( \beta 为旋转角)
[ x ∗ y ∗ z ∗ ] = [ 1 0 0 0 cos β sin β 0 − sin β cos β ] [ x y z ] = R 3 [ x y z ] − − 12 > \left[\begin{array}{c}
x^{*} \\
y^{*} \\
z^{*}
\end{array}\right]=\left[\begin{array}{ccc}
1 & 0 & 0 \\
0 & \cos \beta & \sin \beta \\
0 & -\sin \beta & \cos \beta
\end{array}\right]\left[\begin{array}{l}
x \\
y \\
z
\end{array}\right]=R_{3}\left[\begin{array}{l}
x \\
y \\
z
\end{array}\right] \quad--12> ⎣ ⎡ x ∗ y ∗ z ∗ ⎦ ⎤ = ⎣ ⎡ 1 0 0 0 cos β − sin β 0 sin β cos β ⎦ ⎤ ⎣ ⎡ x y z ⎦ ⎤ = R 3 ⎣ ⎡ x y z ⎦ ⎤ − − 12 >
由 10>, 11>, 12> 可知, 当某点在三维坐标系中旋转时, 其坐标转换关系如下:
[ x ∗ y ∗ z ∗ ] = R 1 R 2 R 3 [ x y z ] = R [ x y z ] − − ③ \left[\begin{array}{c}
x^{*} \\
y^{*} \\
z^{*}
\end{array}\right]=R_{1} R_{2} R_{3}\left[\begin{array}{l}
x \\
y \\
z
\end{array}\right]=R\left[\begin{array}{c}
x \\
y \\
z
\end{array}\right]--③ ⎣ ⎡ x ∗ y ∗ z ∗ ⎦ ⎤ = R 1 R 2 R 3 ⎣ ⎡ x y z ⎦ ⎤ = R ⎣ ⎡ x y z ⎦ ⎤ − − ③
其中 R 为旋转矩阵。
2、平移
做平移时坐标转换较为简单, 如下:
{ x ∗ = x + a y ∗ = y + b z ∗ = z + c \left\{ \begin{array}{l}
{{\rm{x}}^*} = x + a\\
{y^*} = y + b\\
{z^*} = z + c
\end{array} \right. ⎩ ⎨ ⎧ x ∗ = x + a y ∗ = y + b z ∗ = z + c
将其用矩阵表示:
[ x ∗ y ∗ z ∗ 1 ] = [ 1 0 0 a 0 1 0 b 0 0 1 c 0 0 0 1 ] [ x y z 1 ] − − ④ \left[\begin{array}{c}
\mathrm{x}^{*} \\
y^{*} \\
z^{*} \\
1
\end{array}\right]=\left[\begin{array}{llll}
1 & 0 & 0 & a \\
0 & 1 & 0 & b \\
0 & 0 & 1 & c \\
0 & 0 & 0 & 1
\end{array}\right]\left[\begin{array}{c}
x \\
y \\
z \\
1
\end{array}\right]--④ ⎣ ⎡ x ∗ y ∗ z ∗ 1 ⎦ ⎤ = ⎣ ⎡ 1 0 0 0 0 1 0 0 0 0 1 0 a b c 1 ⎦ ⎤ ⎣ ⎡ x y z 1 ⎦ ⎤ − − ④
思考: 为什么不用矩阵 [ x ∗ y ∗ z ∗ ] = [ 1 0 0 a 0 1 0 b 0 0 1 c ] [ x y z ] \left[\begin{array}{c}x^{*} \\ y^{*} \\ z^{*}\end{array}\right]=\left[\begin{array}{cccc}1 & 0 & 0 & a \\ 0 & 1 & 0 & b \\ 0 & 0 & 1 & c\end{array}\right]\left[\begin{array}{l}x \\ y \\ z\end{array}\right] ⎣ ⎡ x ∗ y ∗ z ∗ ⎦ ⎤ = ⎣ ⎡ 1 0 0 0 1 0 0 0 1 a b c ⎦ ⎤ ⎣ ⎡ x y z ⎦ ⎤ 表示, 而要加一个维度呢?
综合(3)(4)可得:
[ x ∗ y ∗ z ∗ 1 ] = [ R ⃗ T ⃗ 0 → 1 ] [ x y z 1 ] − − Ⅱ \left[\begin{array}{c}
x^{*} \\
y^{*} \\
z^{*} \\
1
\end{array}\right]=\left[\begin{array}{ll}
\vec{R} & \vec{T} \\
\overrightarrow{0} & 1
\end{array}\right]\left[\begin{array}{l}
x \\
y \\
z \\
1
\end{array}\right] \quad--Ⅱ ⎣ ⎡ x ∗ y ∗ z ∗ 1 ⎦ ⎤ = [ R 0 T 1 ] ⎣ ⎡ x y z 1 ⎦ ⎤ − − Ⅱ
【注: 这一步可能不好理解, 仔细思考, 这也是上一步(4)为什么要多加一维向量 的原因, 方便这里写成这种形式, 因为 R 为一个 3 × 3 3 \times 3 3 × 3 的矩阵, 这样更方便写成分 块矩阵的形式,同时, 也是方便下文坐标系之间的转换】
综合 I,II 可得【注: I 中的 X c , Y c , Z c \mathrm{Xc}, \mathrm{Yc}, \mathrm{Zc} Xc , Yc , Zc 为 II 中的 x ∗ , y ∗ , z ∗ \mathrm{x}^{*}, \mathrm{y}^{*}, \mathrm{z}^{*} x ∗ , y ∗ , z ∗ 】
[ u v 1 ] = 1 Z c [ 1 d x 0 u 0 0 1 d y v 0 0 0 1 ] [ f 0 0 0 0 f 0 0 0 0 1 0 ] [ R ⃗ T ⃗ 0 → 1 ] [ x w y w z w 1 ] = 1 Z c [ f d x 0 u 0 0 0 f d y 0 0 0 0 1 0 ] [ R ⃗ T ⃗ 0 → 1 ] [ x w y w z w 1 ] \begin{array}{l}
{\left[\begin{array}{l}
u \\
v \\
1
\end{array}\right]=\frac{1}{Z_{c}}\left[\begin{array}{ccc}
\frac{1}{d x} & 0 & u_{0} \\
0 & \frac{1}{d y} & v_{0} \\
0 & 0 & 1
\end{array}\right]\left[\begin{array}{cccc}
f & 0 & 0 & 0 \\
0 & f & 0 & 0 \\
0 & 0 & 1 & 0
\end{array}\right]\left[\begin{array}{ll}
\vec{R} & \vec{T} \\
\overrightarrow{0} & 1
\end{array}\right]\left[\begin{array}{c}
x_{w} \\
y_{w} \\
z_{w} \\
1
\end{array}\right]} \\
=\frac{1}{Z_{c}}\left[\begin{array}{cccc}
\frac{f}{d x} & 0 & u_{0} & 0 \\
0 & \frac{f}{d y} & 0 & 0 \\
0 & 0 & 1 & 0
\end{array}\right]\left[\begin{array}{ll}
\vec{R} & \vec{T} \\
\overrightarrow{0} & 1
\end{array}\right]\left[\begin{array}{c}
x_{w} \\
y_{w} \\
z_{w} \\
1
\end{array}\right] \\
\end{array} ⎣ ⎡ u v 1 ⎦ ⎤ = Z c 1 ⎣ ⎡ d x 1 0 0 0 d y 1 0 u 0 v 0 1 ⎦ ⎤ ⎣ ⎡ f 0 0 0 f 0 0 0 1 0 0 0 ⎦ ⎤ [ R 0 T 1 ] ⎣ ⎡ x w y w z w 1 ⎦ ⎤ = Z c 1 ⎣ ⎡ d x f 0 0 0 d y f 0 u 0 0 1 0 0 0 ⎦ ⎤ [ R 0 T 1 ] ⎣ ⎡ x w y w z w 1 ⎦ ⎤
注 1: 上式 [ x w y w z w 1 ] \left[\begin{array}{c}x_{w} \\ y_{w} \\ z_{w} \\ 1\end{array}\right] ⎣ ⎡ x w y w z w 1 ⎦ ⎤ 即为 II 式中 [ x y z 1 ] \left[\begin{array}{l}x \\ y \\ z \\ 1\end{array}\right] ⎣ ⎡ x y z 1 ⎦ ⎤ , 只因其为世界
坐标系 (world) 下的坐标,这样方便记忆。
注 2: 上式中 [ f d x 0 u 0 0 0 f d y 0 0 0 0 1 0 ] \left[\begin{array}{cccc}\frac{f}{d x} & 0 & u_{0} & 0 \\ 0 & \frac{f}{d y} & 0 & 0 \\ 0 & 0 & 1 & 0\end{array}\right] ⎣ ⎡ d x f 0 0 0 d y f 0 u 0 0 1 0 0 0 ⎦ ⎤ 被称为相机内参矩阵, [ R ⃗ T ⃗ 0 → 1 ] \left[\begin{array}{ll}\vec{R} & \vec{T} \\ \overrightarrow{0} & 1\end{array}\right] [ R 0 T 1 ] 被称为相机外参矩阵。
小结
好啦,本节就为大家介绍到这里啦,这些其实都是一些基础内容,希望大家都能够弄明白喔,一起加油叭!!!🍄🍄🍄
如若文章对你有所帮助,那就🛴🛴🛴