视觉里程计简介

视觉里程计简介

什么是视觉里程计?

首先我们看一看维基百科的介绍在机器人和计算机视觉问题中,视觉里程计就是一个通过分析处理相关图像序列来确定机器人的位置和姿态。
In robotics and computer vision, visual odometry is the process of determining the position and orientation of a robot by analyzing the associated camera images.
我们知道在汽车中有一个里程计,记录着汽车行驶的距离,可能的计算方式就是通过计算车轮滚动的次数乘以轮子的周长,但是里程计会遇到精度的问题,例如轮子打滑,随着时间的增加,误差会变得越来越大。另外在我们机器人和视觉领域,不仅仅要知道行驶的距离,而且要知道机器人行驶的整个轨迹(机器人每个时刻的位置和姿态)我们记着在时间t时刻机器人的位置和姿态信息是 (xt,yt,zt,ψt,χt,ϕt) ( x t , y t , z t , ψ t , χ t , ϕ t ) ,其中 xt,yt,zt x t , y t , z t 表示机器人在世界坐标系中的位置信息, ψt,χt,ϕt ψ t , χ t , ϕ t 表示机器人的姿态,分布表示为roll( ψt ψ t ), pitch( χt χ t ),yaw( ϕt ϕ t )
确定机器人轨迹的方法有很多,我们这里主要讲述的是视觉里程计,正如维基百科所述,我们将一个摄像头(或多个摄像头)刚性连接到一个移动的物体上(如机器人),通过摄像头采集的视频流来确定相机的6自由度,如果使用1个摄像头,则称为单目视觉里程计,如果使用两个(或者更多)摄像机,则称为立体视觉里程计。

单目或立体视觉里程计

主要阐述两者之间的优缺点,立体视觉里程计的优点在于可以估算出精确的轨迹,单目估计的轨迹存在一个比例因子,所以对于单目VO,我们可以说的是机器人在X方向上移动了一个单位,但是对于立体VO,我们可以说机器人在X方向上移动了1米。另外对于立体VO计算的轨迹通常更精确(因为提供了更多的数据),但是在有些情况下,如相见与观测物体的距离相距太远(与立体VO中的两个相机之间的距离进行对比),这样立体VO就退化为单目VO,另外考虑设备的装配,单目更有一些优势,比如在一些非常小的机器人上

基本算法过程

主要阐述简单的算法过程,基于OpenCV3.0进行简单实现,后期进行扩展,对效率及精度进行一步步优化。

输入

  • 通过摄像头获取的视频流(主要为灰度图像),记录摄像头在t和t+1时刻获得的图像为 It I t It+1 I t + 1
  • 相机的内参,通过相机标定获得,可以通过matlab或者opencv计算为固定量

输出

  • 计算每一帧相机的位置+姿态

基本过程

  1. 获取图像 It,It+1 I t , I t + 1
  2. 对获取的图像进行畸变处理
  3. 通过FAST算法对图像 It I t 进行特征检测,通过KLT算法跟踪这些特征到 It+1 I t + 1 中,如果跟踪特征有所丢失,特征数小于某个阈值的时候,重新进行特征检测。
  4. 通过RANSAC的五店算法来估计两幅图像的本章矩阵
  5. 通过计算的本质矩阵来计算R,t
  6. 对尺度进行估计,最终确定旋转矩阵和平移向量

引自冯冰博客

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
视觉里程计(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)或深度学习方法。具体使用哪种方法取决于你的需求和应用场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值