第五讲:相机与图像
文章目录
1. 相机模型
我们使用针孔模型
和镜头畸变
来描述投影过程.
1.1. 针孔相机模型
利用小孔成像原理将三维世界投影到二维平面中.
现在对针孔模型进行简单建模:
- O x y z Oxyz Oxyz 坐标系
- z z z轴指向相机前方
- x x x右方
- y y y下方
- 现实世界的空间点 p p p
- 小孔为坐标中心 O O O
- p p p的投影点在平面 O ′ − x ′ − y ′ O^\prime-x^\prime-y^\prime O′−x′−y′上.
- 成像点为 p ′ p^\prime p′
- p的坐标为 [ X , Y , Z ] T [X,Y,Z]^T [X,Y,Z]T, p ′ p^\prime p′为 [ X ′ , Y ′ , Z ′ ] T [X^\prime,Y^\prime,Z^\prime]^T [X′,Y′,Z′]T
- 物理成像平面到小孔的距离为
f
f
f
根据三角相似的关系:
Z f = − X X ′ = − Y Y ′ \frac{Z}{f} = - \frac{X}{X^\prime} = - \frac{Y}{Y^\prime} fZ=−X′X=−Y′Y
为了简化,我们将物体和成像都放在相机的同侧,这样可以简化掉负号:
Z
f
=
X
X
′
=
Y
Y
′
\frac{Z}{f} = \frac{X}{X^\prime} = \frac{Y}{Y^\prime}
fZ=X′X=Y′Y
整理得:
{
X
′
=
f
X
Z
Y
′
=
f
Y
Z
\begin{cases} X^\prime = f\frac{X}{Z} \\ Y^\prime = f\frac{Y}{Z} \end{cases}
{X′=fZXY′=fZY
尽管现实中小孔成像是倒立的,但是我们人为将其置为正立.
在物理成像平面固定着一个像素平面: o − u − v o-u-v o−u−v, 在像素平面得到的 P ′ P^\prime P′的坐标为: [ u , v ] T [u,v]^T [u,v]T
像素坐标系
: 远点
o
′
o^\prime
o′位于图像的左上角,u 轴向右与x轴平行, v轴向下与y轴平行.
像素坐标系与成像平面之间相差了一个缩放
与原点平移
.
假设像素坐标:
- 在 u u u轴缩放了 α \alpha α倍
- 在 v v v轴缩放了 β \beta β倍
- 原点平移了 [ c x , c y ] T [c_x,c_y]^T [cx,cy]T
P ′ P^\prime P′坐标与像素坐标 [ u , v ] T [u,v]^T [u,v]T之间的关系为:
{ u = α X ′ + c x v = β Y ′ + c y \begin{cases} u=\alpha X^\prime +c_x \\ v=\beta Y^\prime +c_y \end{cases} {u=αX′+cxv=βY′+cy
根据:
X
′
=
f
X
Z
;
Y
′
=
f
Y
Z
X^\prime = f\frac{X}{Z} ;\quad Y^\prime = f\frac{Y}{Z}
X′=fZX;Y′=fZY,可得:
{
u
=
α
f
X
Z
+
c
x
v
=
β
f
Y
Z
+
c
y
\begin{cases} u=\alpha f\frac{X}{Z} +c_x \\ v=\beta f\frac{Y}{Z} +c_y \end{cases}
{u=αfZX+cxv=βfZY+cy
令
α
f
=
f
x
;
β
f
=
f
y
\alpha f= f_x; \quad \beta f=f_y
αf=fx;βf=fy,得:
{
u
=
f
x
X
Z
+
c
x
v
=
f
y
Y
Z
+
c
y
\begin{cases} u=f_x\frac{X}{Z} +c_x \\ v=f_y\frac{Y}{Z} +c_y \end{cases}
{u=fxZX+cxv=fyZY+cy
将其化为矩阵形式:
[
u
v
1
]
=
1
Z
[
f
x
0
c
x
0
f
y
c
y
0
0
1
]
[
X
Y
Z
]
≜
1
Z
K
P
\begin{bmatrix} u\\v\\1 \end{bmatrix} = \frac{1}{Z} \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} X \\ Y \\ Z \end{bmatrix} \triangleq \frac{1}{Z}KP
⎣⎡uv1⎦⎤=Z1⎣⎡fx000fy0cxcy1⎦⎤⎣⎡XYZ⎦⎤≜Z1KP
将Z移动到左边:
Z
[
u
v
1
]
=
[
f
x
0
c
x
0
f
y
c
y
0
0
1
]
[
X
Y
Z
]
≜
K
P
Z \begin{bmatrix} u\\v\\1 \end{bmatrix} = \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} X \\ Y \\ Z \end{bmatrix} \triangleq KP
Z⎣⎡uv1⎦⎤=⎣⎡fx000fy0cxcy1⎦⎤⎣⎡XYZ⎦⎤≜KP
将
K
K
K称为内参矩阵
.
P
P
P的世界坐标到像素坐标的投影关系:
Z
P
u
v
=
Z
[
u
v
1
]
=
K
(
R
P
w
+
t
)
=
K
T
P
w
ZP_{uv}=Z\begin{bmatrix} u\\v\\1 \end{bmatrix} = K(RP_w +t) = KTP_w
ZPuv=Z⎣⎡uv1⎦⎤=K(RPw+t)=KTPw
上式两端都是齐次坐标. 所以可以将Z去掉:
P u v = K T P w P_{uv} = KTP_w Puv=KTPw
右侧的
T
P
w
TP_w
TPw表示把世界坐标系下的齐次坐标变换到相机坐标系下.为了使它能够与K相乘, 取它的前三维组成三维向量.
然后按照齐次坐标的方式将其归一化处理:
假设:
(
T
P
w
)
(
1
:
3
)
=
[
X
Y
Z
]
=
P
~
c
(TP_w)_{(1:3)} = \begin{bmatrix} X \\ Y \\ Z \end{bmatrix} = \tilde{P}_c
(TPw)(1:3)=⎣⎡XYZ⎦⎤=P~c
归一化:
P
c
=
[
X
/
Z
Y
/
Z
1
]
P_c = \begin{bmatrix} X/Z \\ Y/Z \\ 1 \end{bmatrix}
Pc=⎣⎡X/ZY/Z1⎦⎤
所以我们可以把像素坐标 [ u , v ] T [u,v]^T [u,v]T 看成是对归一化平面的点进行量化的过程.
1.2. 畸变
由透镜引起的畸变称为径向畸变
.主要分为两类:桶形畸变
和枕形畸变
.
在畸变中穿过图像中心和光轴有焦点的直线还能保持形状不变.
在相机的 组装过程中由于透镜和成像面不能严格的平行会产生切向畸变
.
对于径向畸变无论是桶形畸变还是枕形畸变,因为他们都是随着与中心的距离增加而增加,因此可以用一个多项式函数来描述该变化:
x
d
i
s
t
o
r
t
e
d
=
x
(
1
+
k
1
r
2
+
k
2
r
4
+
k
3
r
6
)
y
d
i
s
t
o
r
t
e
d
=
y
(
1
+
k
1
r
2
+
k
2
r
4
+
k
3
r
6
)
x_{distorted}=x(1+k_1r^2+k_2r^4+k_3r^6) \newline y_{distorted}=y(1+k_1r^2+k_2r^4+k_3r^6)
xdistorted=x(1+k1r2+k2r4+k3r6)ydistorted=y(1+k1r2+k2r4+k3r6)
- [ x , y ] T [x,y]^T [x,y]T是归一化平面点的坐标
- [ x d i s t o r t e d , y d i s t o r t e d ] T [x_{distorted},y_{distorted}]^T [xdistorted,ydistorted]T 是畸变后的点坐标。
对于切向畸变
可以使用另外两个参数
p
1
,
p
2
p_1,p_2
p1,p2进行纠正.
x d i s t o r t e d = x + 2 p 1 x y + p 2 ( r 2 + 2 x 2 ) y d i s t o r t e d = y + p 1 ( r 2 + 2 y 2 ) + 2 p 2 x y x_{distorted}=x+2p_1xy+p_2(r^2+2x^2) \newline y_{distorted}=y+p_1(r^2+2y^2)+2p_2xy xdistorted=x+2p1xy+p2(r2+2x2)ydistorted=y+p1(r2+2y2)+2p2xy
因此对于坐标系的点我们通过5个畸变系数得到它在像素平面的正确位置:
-
三维空间点投影到归一化平面坐标为: [ x , y ] T [x,y]^T [x,y]T
-
进行径向畸变和切向畸变:
{ x d i s t o r t e d = x ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) + x + 2 p 1 x y + p 2 ( r 2 + 2 x 2 ) y d i s t o r t e d = y ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) + y + p 1 ( r 2 + 2 y 2 ) + 2 p 2 x y \begin{cases} x_{distorted}=x(1+k_1r^2+k_2r^4+k_3r^6) +x+2p_1xy+p_2(r^2+2x^2) \\ y_{distorted}=y(1+k_1r^2+k_2r^4+k_3r^6) + y+p_1(r^2+2y^2)+2p_2xy \end{cases} {xdistorted=x(1+k1r2+k2r4+k3r6)+x+2p1xy+p2(r2+2x2)ydistorted=y(1+k1r2+k2r4+k3r6)+y+p1(r2+2y2)+2p2xy
-
通过内参矩阵投影到像素平面:
{ u = f x x d i s t o r t e d + c x v = f y y d i s t o r t e d + c y \begin{cases} u=f_xx_{distorted} +c_x \\ v=f_yy_{distorted}+c_y \end{cases} {u=fxxdistorted+cxv=fyydistorted+cy
总结单目相机的成像过程:
- 世界坐标下有一个固定点 P P P,它的世界坐标为 P w P_w Pw
- P P P的相机坐标为 P c = R P w + t P_c=RP_w +t Pc=RPw+t
- 把 P c P_c Pc归一化为 P c = [ X / Z , Y / Z , 1 ] T P_c=[X/Z,Y/Z,1]^T Pc=[X/Z,Y/Z,1]T
- 经过内参得到像素坐标, P u v = K P c P_{uv} = KP_c Puv=KPc
1.3. 双目相机模型
设一个空间点 P P P,它在左右眼相机成像分别为 P L , P R P_L,P_R PL,PR
这两个成像也只有在x轴上有差异. 记它的左右侧x轴坐标分别为 u L , u R u_L,u_R uL,uR
根据
Δ
P
L
P
R
和
Δ
O
L
O
R
\Delta P_LP_R和\Delta O_LO_R
ΔPLPR和ΔOLOR的相似关系:
z
−
d
z
=
b
−
u
L
+
u
R
b
\frac{z-d}{z} = \frac{b-u_L+u_R}{b}
zz−d=bb−uL+uR
整理得:
z
=
f
b
d
,
d
=
u
L
−
u
R
z=\frac{fb}{d},\quad d=u_L-u_R
z=dfb,d=uL−uR
- d表示视差
- z表示物体离相机的距离
1.4. RGB-D 相机模型
它能够主动测量每个像素的深度.原理是向目标发射一束光线,然后测量接收到的时间.
RGB-D相机分为两大类:
- 红外结构光.
- 飞行时间法.
2. 图像
在计算机中图像存储为一个二维数组.
由于图像的坐标定义为:x轴为宽,y轴为高.所以访问图像中像素点: i m a g e [ y ] [ x ] image[y][x] image[y][x],对应的灰度值为 I ( x , y ) I(x,y) I(x,y)
一个像素的灰度可以用8位整数记录, 也就是0~255的值.如果要记录像素点更多的信息,必须增加灰度值的位数.
彩色图像的表示则需要通道的概念.对于每个像素我们需要记录R,G,B三个数值,每个数值称为一个通道. 最常见的彩色通道由8位整数表示.
3. 实践:图像的存取与访问
3.1. 安装openCV
- 从源码安装
- 安装库文件
在编译之前先安装opencv的依赖
sudo apt-get install build-essential libgtk2.0-dev libvtk5-dev libjpeg-dev libtiff4-dev libjasper-dev libopenexr-dev libtbb-dev
如果从源码安装,OpenCV会在CMake阶段检查依赖是否安装,并调用自己的功能.
本所能够使用openCV3系列
3.2. 操作opencv的图像
代码见/code/第五讲
3.3. 实践:点云拼接
- 根据RGB-D图像和相机内参,可以计算任何一个像素在相机坐标下的位置.
- 根基相机位姿又能计算出这写点下世界坐标中 的位置.
书中的点云库是PCL库.
代码见/code/第五讲