这里写目录标题
Basics of Image Formation
数字图像
图像由像素网格组成如下图所示
为了表示图像,我们使用形状为(H,W,3)的三维数组。我们说该数组有H行,W列和3个颜色通道(红色,绿色和蓝色)。让我们用python加载图片,看看吧!
import numpy as np
import matplotlib.pyplot as plt
from pathlib import Path
import cv2
img_fn = str(Path("images/carla_scene.png"))
img = cv2.imread(img_fn)
# opencv (cv2) stores colors in the order blue, green, red, but we want red, green, blue
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)
plt.xlabel("$u$") # horizontal pixel coordinate
plt.ylabel("$v$") # vertical pixel coordinate
print("(H,W,3)=",img.shape)
(H,W,3)= (512, 1024, 3)
让我们检查第100行和第750列中的像素:
u,v = 750, 100
img[v,u]
这意味着u,v = 750、100处的像素具有红色强度28,绿色强度59和蓝色强度28。因此,它是绿色的。如果我们查看图像,这很有意义,因为在u,v = 750,100处有一棵树。另外,上述输出“ dtype = uint8”告诉我们红色,绿色和蓝色强度存储为8位无符号整数,即uint8。因此,它们是0到255之间的整数。
下图概述了到目前为止我们已经学到的有关存储数字栅格图像的知识:
如果您的数字图像是由相机拍摄的,则数字图像中的像素与相机图像传感器中的“传感器像素”之间存在直接对应关系。
图像传感器由光电传感器的二维阵列组成。每个光电传感器通过光电效应将入射光转换为电能,通过模数转换器将其转换为数字信号。为了获得颜色信息,将一个“传感器像素”划分为2 x 2的光电传感器网格,并在这4个光电传感器的前面放置不同的色彩过滤器。一个光电传感器仅通过蓝色过滤器接收光,一个仅通过红色过滤器接收光,而两个通过绿色过滤器接收光。将这4个测量值结合起来,就可以得到一个三色组合:(红色强度,绿色强度,蓝色强度)。这称为拜耳过滤器。
针孔相机
您将无法像这样捕获清晰的图像,因为图像传感器上的一个点将被整个环境的光线照射。现在,假设将图像传感器放在具有很小针孔(也称为光圈)的盒子中。
现在,大部分光线都被遮挡了,我们在图像传感器上获得了正确的图像。图像颠倒了,但这不应该困扰我们。如果是理想的针孔,则图像传感器上的每个点都只会受到来自外部的一束光线的撞击。
理想针孔:近似值
在现实世界中,孔的大小不能太小,因为没有足够的光线进入盒子。另外,我们将遭受衍射的困扰。孔也不能太大,因为来自不同角度的光线会撞击图像传感器上的同一点,并且图像会变得模糊。为了防止模糊,在真实相机中安装了镜头。我们将在本节中讨论的针孔相机模型不包括镜头的影响。但是,事实证明,它非常适合带镜头的相机,并且是相机的实际模型。因此,下面我们可以继续将针孔视为理想的针孔。
以下草图介绍了图像平面:
虽然图像传感器是针孔后面的距离,但所谓的图像平面(是一种假想的构造)是针孔前面的距离。我们可以通过相似三角形将对象的大小与其在图像传感器上的大小相关联
这意味着随着到相机的距离增加,图像中的物体尺寸变小:远处的物体在图像中显得较小。我们可以概括一下(1),如果我们定义图像平面中的坐标,如下图所示。
相机坐标系的原点
(
X
c
,
Y
c
,
Z
c
)
(X_c,Y_c,Z_c)
(Xc,Yc,Zc)位于针孔的位置。灰色阴影区域是图像平面上被图像传感器捕获的部分。坐标
(
u
,
v
)
(u,v)
(u,v)是已经在图4中引入的像素坐标。该草图使我们能够确定相机参考系中的三维点
P
=
(
X
c
,
Y
c
,
Z
c
)
P=(X_c,Y_c,Z_c)
P=(Xc,Yc,Zc)到像面中的二维点
(
x
,
y
)
(x,y)
(x,y)的映射。我们来看一下
Z
c
−
X
c
Z_c-X_c
Zc−Xc平面:
现在,我们要确定哪些像素坐标
(
u
,
v
)
(u,v)
(u,v)对应于这些值
(
x
,
y
)
(x,y)
(x,y)(参见图10)。首先,我们注意到所谓的 principal poin
(
x
=
0
,
y
=
0
)
(x=0, y=0)
(x=0,y=0)t具有像素坐标
(
u
0
,
v
0
)
=
(
W
/
2
,
H
/
2
)
(u_0,v_0)=(W/2,H/2)
(u0,v0)=(W/2,H/2)。由于
x
x
x和
y
y
y以米为单位,因此我们需要知道图像平面中以米为单位的一个“传感器像素”的宽度和高度,如果像素宽度
K
u
K_u
Ku(以米为单位)和像素高度为
K
v
K_v
Kv,则
如果我们定义
并且可以将上述方程式表达为矩阵形式
通常。要继续我们的讨论,我们需要介绍齐次坐标的概念.
因此,如果我们将上述方程式解释为齐次矢量的方程式,则可以吸收标量因子并将方程式重写为
Reference frames
在我们的应用程序中,我们将处理不同的坐标系,因此我们将不会总是在摄像机参考系的坐标
(
X
c
,
Y
c
,
Z
c
)
T
{(X_c,Y_c,Z_c)}^T
(Xc,Yc,Zc)T中给出点P。对于我们的车道检测系统,以下参考框架是相关的
默认摄像机框架的轴对应于车辆的“右”,“下”和“向前”方向。即使我们想要以与摄像机默认框架相同的方式安装摄像机,我们也可能会犯一些小错误。在练习中,摄像机框架相对于默认摄像机框架略微旋转,但仅沿
X
d
X_d
Xd-轴:摄像机的俯仰角为15°。
在下文中,我们将描述如何在世界坐标和摄影机坐标之间进行转换,但是在以上两个参考帧之间的转换都采用相同的数学方法。世界坐标系中的点
(
X
w
,
Y
w
,
Z
w
)
T
{(X_w,Y_w,Z_w)}^T
(Xw,Yw,Zw)T通过旋转矩阵
R
∈
R
3
×
3
R ∈ R^{3×3}
R∈R3×3和平移矢量
t
t
t 映射到摄像机坐标系中的点
我们可以只用矩阵乘法就可以写出这种变换定律
我们在最后一个等式中定义了转换矩阵
T
c
w
T_{cw}
Tcw 。只需使用矩阵就可以关联不同参考系的坐标,这是非常棒的。这样可以很容易地进行几种转换,例如从世界到摄像机坐标,再从摄像机到道路坐标。它还使我们能够使用矩阵逆获得逆变换:从相机到世界坐标的变换由矩阵给出
T
c
w
=
T
c
w
−
1
T_{cw}={T_{cw}}^{-1}
Tcw=Tcw−1。
总结本节,得出以下式子:
或通过定义内在相机矩阵
K
K
K和外在相机矩阵
(
R
∣
t
)
(R|t)
(R∣t)
练习:将车道边界投影到图像中
现在,您应该开始第一个练习。在本练习中,我为您准备了一些数据。我使用安装在车辆上的摄像头传感器在Carla模拟器中捕获了图像:
另外,我创建了包含以下内容的txt文件:
- 车道边界的世界坐标
- 将世界坐标映射到摄像机参考系中坐标的变换矩阵
您的工作是根据等式(最后的等式)编写代码,从而创建这样的标签图像
To start working on the exercises, open code/tests/lane_detection/lane_boundary_projection.ipynb and follow the instructions in that notebook.