干货 _ 双目相机标定与图像深度估计

干货 | 双目相机标定与图像深度估计

前 言

当我们以 2D 形式拍摄图像时,由于透视投影过程,所有深度信息都会丢失。拍摄图像时,它会从 3D 转换为 2D,并呈现在 2D 平面上,其中每个点(或像素)与相机镜头的距离根本不存在。这会导致深度信息的丢失。但这正是我们用 2D 图像进行三维重建所需要的信息。我们解决方案的关键在于使用第二台相机拍摄同一物体的照片并比较每张图像以提取深度信息。

image

附赠自动驾驶最全的学习资料和量产经验:链接

我们的眼睛类似于两台相机。由于它们从不同的角度观察图像,因此它们可以计算两个视点之间的差异并建立距离估计。使用双眼正面注视物体会产生深度,因为我们自己的视觉似乎会汇聚在一起。这类似于透视照片,其中所有平行线在某个遥远的地平线点相交。

立体视觉系统有两个摄像头,位于已知距离处,可同时拍摄场景。利用摄像头的几何形状,我们可以应用算法并创建环境的几何形状。在这样的系统中,必须校准每个独立摄像头的位置和光学参数,以便使用三角测量方法确定每个图像中像素之间的对应关系。

实际上,立体视觉借助两个摄像头分四个阶段实现:

1. 畸变校正——消除图像上镜头的径向和切向畸变,以获得无失真的图像。

2. 矫正过程中相机间的角度和距离调整,矫正结果为线对齐,即同一平面的两幅图像共面,且线的方向一致,y 坐标相同。

3. 匹配特征点过程——寻找左右摄像头点之间的对应关系。这将产生视差图——其中的值对应于左右摄像头同一点的图像 x 坐标的差异。

4. 因此,有了相机的几何排列,我们就可以生成视差图三角剖分。这是重新投影的阶段,形成深度图,即所需的 3D 场景。

对于前两个阶段,必须首先计算一对摄像机的配置参数。

相机标定

相机标定是对相机参数的估计,该相机参数用于确定现实世界中的 3D 点与该校准相机捕获的图像中对应的 2D 投影(像素)之间的精确关系。

相机标定的主要目的是消除图像中的失真,从而建立图像像素与现实世界尺寸之间的关系。为了消除失真,我们需要找到固有矩阵K中的固有参数和失真参数。

图像畸变

畸变可以是径向的,也可以是切向的。标定有助于消除图像畸变。

image

**径向畸变:**当光线在镜头边缘的弯曲程度大于镜头光学中心的弯曲程度时,就会发生径向畸变。它本质上会使图像中的直线看起来略微弯曲。

image

image

x, y — 图像坐标系中未畸变的像素。

k1, k2, k3 — 镜头的径向畸变系数。

**切向畸变:**当所用相机的镜头未完全对准(即与图像平面平行)时,就会发生这种畸变。这会使图像延长或倾斜,使物体看起来比实际距离更远或更近。

image

image

x, y — 图像坐标系中未畸变的像素。

p1, p2 — 镜头的切向畸变系数。

这种畸变可以通过五个称为畸变系数的数字来捕捉,其值反映了图像中径向和切向畸变的量。

image

我们需要相机的内在和外在参数来找到畸变系数参数(k1、k2、k3、p1、p2)。内在参数是相机特定的(同一台相机的参数相同),即焦距(fx、fy)和光学中心(cx、cy)。

内在参数仅取决于相机特性,而外在参数取决于相机位置。

image

包含这些参数的矩阵称为相机矩阵。

3D 世界坐标到 2D 图像坐标的映射

校准将具有 [X, Y, Z] 坐标的 3D 点(在世界上)映射到具有 [X, Y] 坐标的 2D 像素。

通过校准的相机,我们可以通过相机坐标将世界坐标转换为像素坐标。

image

  • 外部校准将世界坐标转换为相机坐标。外部参数称为 R(旋转矩阵)和 T(平移矩阵)。

  • 内在校准将相机坐标转换为像素坐标。它需要相机的内部值,例如焦距、光学中心。内在参数是一个矩阵,我们称之为 K。

image

在相机标定的过程中,我们有两个公式可以将一个点O从世界坐标系拿到像素空间中:

  • 世界到相机的转换

image

内参矩阵是基本基础矩阵中仅与外部参数相关的部分。

  • 相机坐标到图像坐标的转换

image

  • 世界坐标到图像坐标的转换

image

但是矩阵不匹配。因为这个世界矩阵需要从 [XYZ] 修改为 [XYZ 1]。这个“1”被称为齐次坐标。

image

P = [R|T]K

如果我们有二维坐标,那么使用校准参数,我们可以使用以下方程映射到三维,反之亦然:

image

立体校正基本上是两个相机之间的校准。

对极几何——立体视觉

立体视觉是根据两幅图像寻找深度。立体视觉系统由两个摄像头组成,一个左摄像头,一个右摄像头。这两个摄像头沿相同的 Y 轴和 Z 轴对齐。基本上,唯一的区别是它们的 X 值

由于立体相机采用对极几何,因此我们不会在整个图像中搜索某个点,而是仅沿立体图像的水平 x 轴搜索特定点。简而言之,我们所要做的就是找到左图中某个点与右图中沿同一 x 轴的位置的对应关系,通常带有偏移和范围。这大大降低了我们算法的空间复杂度,并将多维问题简化为一维。

  • X 是对齐轴

  • Y 是高度

  • Z 是深度

两个蓝色平面图对应每个摄像机的图像。

image

  • xL 对应于左侧相机图像中的点。xR 对应于右侧图像中的点。

  • b 是基线,是两个摄像机之间的距离。

image

左相机方程:

👉 Z = X*f / XL

右相机方程:

image

👉Z = (X-b)*f/XR

综合起来,正确的视差 d = XL — XR

Z与XL—XR成反比,即深度越小,视差越大,越近的物体视差越大。这也是为什么视差图中越近的物体越暗的原因。

人类视觉系统也会产生视差误差,当从两个不同的视线看到图像时,物体似乎在移动,就会产生视差误差。对于较近的物体,视差误差更为明显,表明视差较大,因为同一点出现在两个投影的不同位置。由于存在反比关系,它必须对应于短景深。

image

点的移动和物体与相机的距离成反比,即点的移动越大,物体与相机的距离就越小。

因此,从立体图像对获得的视差值与相机之间的距离成正比,与物体与两个相机之间的距离成反比。

什么是视差?

视差是指从两个不同的摄像机角度拍摄的同一 3D 点的图像位置的差异。

image

为了计算视差,我们必须找到左图中的每个像素,并将其与右图中的每个像素进行匹配。这称为立体对应问题。

立体对应解决方案:

  • 取左图中的像素

  • 现在,要在正确的图像中找到这个像素,只需在极线上搜索它即可。无需进行 2D 搜索,该点应位于这条线上,搜索范围缩小到 1D。

这是因为摄像机沿着相同的 Y 轴和 Z 轴对齐。

深度估计:

  • 将投影矩阵分解为相机本征矩阵𝐾和外部矩阵 R、t。

  • 从 𝐾 矩阵获取焦距 f

  • 使用平移向量 𝑡 中的相应值计算基线 𝑏

  • 使用以下公式计算图像的深度图和计算出的视差图d:

image

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,很高兴为您解答这个问题。 在深度学习中,数据增强是一种常用的技术,它可以通过对原始数据进行变换、裁剪、旋转、翻转等操作,来扩充训练集,从而提高模型的泛化能力和鲁棒性。在图像领域,常用的数据增强方法包括随机裁剪、随机旋转、随机翻转、色域变换等。下面,我将为您介绍如何使用 Python 对图像进行随机数据增强。 1. 随机裁剪 随机裁剪是一种简单而有效的数据增强方法,它可以通过对原始图像进行随机裁剪,来扩充训练集。在 Python 中,我们可以使用 PIL 库中的 Image 模块来实现随机裁剪。 ```python from PIL import Image import random def random_crop(img, crop_size): w, h = img.size left = random.randint(0, w - crop_size) top = random.randint(0, h - crop_size) right = left + crop_size bottom = top + crop_size return img.crop((left, top, right, bottom)) ``` 2. 随机旋转 随机旋转是一种常用的数据增强方法,它可以通过对原始图像进行随机旋转,来扩充训练集。在 Python 中,我们可以使用 PIL 库中的 Image 模块来实现随机旋转。 ```python from PIL import Image import random def random_rotate(img, angle_range): angle = random.uniform(-angle_range, angle_range) return img.rotate(angle) ``` 3. 随机翻转 随机翻转是一种简单而有效的数据增强方法,它可以通过对原始图像进行随机翻转,来扩充训练集。在 Python 中,我们可以使用 PIL 库中的 Image 模块来实现随机翻转。 ```python from PIL import Image import random def random_flip(img, flip_prob): if random.random() < flip_prob: return img.transpose(Image.FLIP_LEFT_RIGHT) return img ``` 4. 色域变换 色域变换是一种常用的数据增强方法,它可以通过对原始图像进行色彩变换,来扩充训练集。在 Python 中,我们可以使用 PIL 库中的 Image 模块来实现色域变换。 ```python from PIL import Image import random def random_color(img, color_range): r, g, b = img.split() r = r.point(lambda i: i + random.randint(-color_range, color_range)) g = g.point(lambda i: i + random.randint(-color_range, color_range)) b = b.point(lambda i: i + random.randint(-color_range, color_range)) return Image.merge('RGB', (r, g, b)) ``` 以上就是使用 Python 进行随机数据增强的一些常用方法,希望对您有所帮助。如果您有任何问题,请随时联系我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值