视觉里程计学习笔记

一、相机

1、双目相机的D、P、K、R矩阵是相机标定时得到的一组重要参数,它们分别代表以下含义:

  1. D矩阵畸变矫正参数矩阵。它包含了相机图像坐标系下的径向畸变和切向畸变系数,用于将畸变像素坐标转化为无畸变的像素坐标。对每个相机而言都有一个D矩阵。

  2. P矩阵投影矩阵。它包含了左右两个相机的内参数和外参数信息,可以把3D空间中的点映射到左右两个相机图像平面上的像素坐标。对每个相机而言都有一个P矩阵。

  3. K矩阵内参矩阵。它描述了相机光轴、焦距、光心等内部参数。对每个相机而言都有一个K矩阵。

  4. R矩阵旋转矩阵。它描述了左相机坐标系到右相机坐标系的旋转关系。也就是说,当我们在左相机拍摄一张图像时,R矩阵可以将同一个场景在右相机下的对应点的坐标姿态与左相机下的对应点的坐标姿态联系起来。

  5. 相机的投影矩阵P可以通过相机参数来计算得到。一般来说,相机参数包括内参和外参两个部分,其中内参表示相机的内部参数,如焦距、像素大小等,而外参则表示相机在空间中的位置和朝向。

    对于透视投影,相机的投影矩阵可以使用以下公式进行计算

    P = K [R | t]

    其中,K 是内参矩阵,R 是旋转矩阵,t 是平移向量。将它们组合成外参矩阵 [R|t],然后再乘以内参矩阵 K,就得到了相机的投影矩阵 P

    如果相机已经标定好了,那么它的内参矩阵和外参矩阵都可以通过标定得到。如果没有标定,则需要根据实际情况自行估计这些参数。

二、计算相机运动

  1. 单目相机:只知道2D像素坐标,根据两组2D点估计运动。使用对极几何解决
  2. 相机为双目、RGB-D时,或者获取了距离信息,那么问题就是根据两组3D点估计运动。通常用ICP求解
  3. 一组为3D,一组为2D,即得到一些3D点和它们在相机的投影位置,也能估计相机运动,通过PnP求解

对极几何2D-2D

对极约束:

对极约束简洁地给出了两个匹配点的空间位置关系。相机位姿估计问题简化为一下两步:

  1. 根据配对点的像素位置求出E或者F。
  2. 根据E或者F 求出R,t.

相机内参已知,求解E更简单。

根据已经求出的本质矩阵E,恢复出相机的运动R,t. 可通过奇异值(SVD)分解得到。

从E分解到R, t的过程中,如果相机发生纯旋转,导致t为0,那么,得到的E也将为0,这将导致无法求解R。可以依靠H(单应矩阵)求取旋转,但仅有旋转时,无法用三角测量估计特征点的空间位置。

单目初始化不能只有旋转,必须要有一定长度的平移。

在单目SLAM中,需要通过三角测量(Triangulation)的方法估计地图点的深度。(必须有平移

三角测量:通过对不同位置同一个路标点进行观察,从观察到的位置推断路标点的距离。

提高三角化的精度有两种办法:

  • 提高特征点的精度,即提高图像分辨率
  • 使平移量增大。

平移太大可能呆滞匹配失效;平移太小,则三角化精度不够。这个问题也叫“视差”。

3D-2D:PnP

PnP使求解3D到2D点对运动的方法。特征点的3D位置可以由三角化或者RGB-D相机的深度图确定。

  • 在双目或RGB-D的视觉里程中,我们可以直接使用PnP估计相机运动。
  • 在单目视觉里程计中,必须先进性初始化,才能使用PnP。

3D-2D方法不需要使用对极约束,又可以在很少的匹配点中获得较好的运动估计,是一种最重要的姿态估计方法。

PnP求解方法:直接线性变换(DLT)、EPnP、UPnP、构建最小二乘法并迭代求解(光束平差法Bundle Adjustment,BA)

Bundle Adjustment

重投影误差的非线性最小二乘问题。这一类把相机和三维点放在一起进行最小化的问题。统称为Bundle Adjustment。

如果相机是连续运动的,也可以直接使用BA求解相机位姿。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
视觉里程计(Visual Odometry)是一种通过从相机图像序列中估计相机在空间中的运动的技术。在MATLAB中,你可以使用计算机视觉系统工具箱(Computer Vision System Toolbox)来实现视觉里程计。 首先,你需要提供一个包含连续图像帧的图像序列。然后,你可以使用视觉里程计对象来估计相机的运动。以下是一个简单的示例代码: ```matlab % 读取图像序列 imageSequence = imageDatastore('路径/图像文件夹/*.png'); % 创建视觉里程计对象 vo = vision.OpticalFlow('ReferenceFrameSource', 'Property', 'ReferenceFrameDelay', 5); % 初始化相机姿态 initialPose = eye(4); % 处理图像序列 while hasdata(imageSequence) % 读取当前帧 frame = read(imageSequence); % 将当前帧传递给视觉里程计对象 [motion, pose] = vo(frame); % 更新相机姿态 initialPose = initialPose * pose; % 可以在这里使用运动和姿态信息进行后续处理,比如建立三维地图等 % 可视化结果(可选) showFrameWithPose(frame, initialPose); end ``` 这只是一个简单的示例,实际应用中可能需要更复杂的处理和算法。你可以根据你的特定需求来调整代码。此外,MATLAB提供了丰富的计算机视觉函数和工具箱,可以帮助你进行更高级的视觉里程计视觉SLAM(Simultaneous Localization and Mapping)任务。 请注意,这只是一种基于视觉特征的视觉里程计方法,还有其他的方法,比如基于直接法(Direct Method)或深度学习方法。具体使用哪种方法取决于你的需求和应用场景。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值