vSLAM重读(5): vSLAM中对双目相机的数据处理及与单目相对比

2023-05-16

1. 双目相机概述

  • 双目立体视觉模型

    双目模型求取深度

    • 双目立体相机分别校准可参考 ROS_单目相机_分别校准
  • 双目立体匹配算法案例

    https://www.cnblogs.com/riddick/p/8486223.html
    https://www.cnblogs.com/zyly/p/9373991.html

  • 双目相机的特性

    1.双目相机有左右两个视野图,所以有了参数基线

    • 基线的特性

      1.当系统的硬件结构固定不变,则通过外参校准的T中的位移量可对比参考基线长;且工作距离越大,测量精度越低。

      2.当基线增大时,FOV中水平角在增大,其对精度的影响是非线性的。

  • 双目相机的矫正

    • 相机内参标定

      相机内参标定,获取相机坐标系与图像坐标系之间的投影关系,如(fx, fy, cx, cy, k1, k2, k3, 等)

    • 相机外参标定

      相机外参反应的是摄像机坐标系和世界坐标系之间的旋转R+T关系,双目相机外参主要获取两个相机之间“基线”

  • 双目相机的立体匹配算法

    在双目相机中特征点的匹配与单目类似,用光流法跟踪特征,选取匹配点。

    然后对匹配的特征点对计算本质矩阵,再分解矩阵获得旋转矩阵R和平移矩阵t;

    • 基于局部的块匹配 - BM(Block Matching StereoBM)

    • 半全局块匹配 - SGBM(Semi-Global-Block-Matching)

    SGBM算法要远远优于BM算法。

2. 单目相机+双目相机+深度相机(结构光)+TOF对比

  • 单目无法确认深度

单目SLAM不受环境大小的影响,因此既可以用于室内,又可以用于室外。

  • 双目相机

双目相机标定配置较为复杂(why?)(好像还有一个对准,有点不太记得…欢迎补充):

1. 双目相机的各个单独的镜头需要内参校准;
2. 双目相机的各个单独的镜头需要外参校准;
3. 双目相机两个相机之间需要校准;
4. 双目相机的两个相机校准之后还要与出厂的基线对齐,若误差较大则校准失败。

双目相机的优势: 它不管在静止和运动下都可以直接估计场景的深度值。其深度量程受双目的基线和分辨率限制。

另外,使用双目相机去计算视差,还原深度值,比较耗时(如SGBM立体匹配)。

  • 结构光测量 (主动式测量:可以直接获取距离值)

3D结构光投射的是散斑或编码图案,接收模组需要拍摄到清晰的图案才能计算出深度。

而随着距离的增加,投出的图案或出现模糊,或出现亮度能量上的衰减,导致深度图不完整,出现破洞,甚至于失效,所以3D结构光并不适用于远距离深度信息采集。

结构光在室外容易受到强光的影响,效果很差。因为光斑成像很容易受到环境的干扰。
结构光的测量距离一般较近(0.1~10m)如realsense D435
  • TOF(飞行时间测距法) (主动式测量:可以直接获取距离值)

TOF是通过红外光发射器发射调制后的红外光脉冲,不停地打在物体表面,经反射后被接收器接收,通过相位的变化来计算时间差,进而结合光速计算出物体深度信息

不受环境光照的影响,室内室外都可行。TOF测量的距离一般较远(0.4~130m) 如VLP16

3. 视差图和深度图的填充方法

以视差图dispImg为例。计算图像的积分图integral,并保存对应积分图中每个积分值处所有累加的像素点个数n(空洞处的像素点不计入n中,因为空洞处像素值为0,对积分值没有任何作用,反而会平滑图像)。

采用多层次均值滤波。首先以一个较大的初始窗口去做均值滤波(积分图实现均值滤波就不多做介绍了,可以参考我之前的一篇博客),将大区域的空洞赋值。然后下次滤波时,将窗口尺寸缩小为原来的一半,利用原来的积分图再次滤波,给较小的空洞赋值(覆盖原来的值);依次类推,直至窗口大小变为3x3,此时停止滤波,得到最终结果。

多层次滤波考虑的是对于初始较大的空洞区域,需要参考更多的邻域值,如果采用较小的滤波窗口,不能够完全填充,而如果全部采用较大的窗口,则图像会被严重平滑。因此根据空洞的大小,不断调整滤波窗口。先用大窗口给所有空洞赋值,然后利用逐渐变成小窗口滤波覆盖原来的值,这样既能保证空洞能被填充上,也能保证图像不会被过度平滑

void insertDepth32f(cv::Mat& depth)
{
    const int width = depth.cols;
    const int height = depth.rows;
    float* data = (float*)depth.data;
    cv::Mat integralMap = cv::Mat::zeros(height, width, CV_64F);
    cv::Mat ptsMap = cv::Mat::zeros(height, width, CV_32S);
    double* integral = (double*)integralMap.data;
    int* ptsIntegral = (int*)ptsMap.data;
    memset(integral, 0, sizeof(double) * width * height);
    memset(ptsIntegral, 0, sizeof(int) * width * height);
    for (int i = 0; i < height; ++i)
    {
        int id1 = i * width;
        for (int j = 0; j < width; ++j)
        {
            int id2 = id1 + j;
            if (data[id2] > 1e-3)
            {
                integral[id2] = data[id2];
                ptsIntegral[id2] = 1;
            }
        }
    }
    // 积分区间
    for (int i = 0; i < height; ++i)
    {
        int id1 = i * width;
        for (int j = 1; j < width; ++j)
        {
            int id2 = id1 + j;
            integral[id2] += integral[id2 - 1];
            ptsIntegral[id2] += ptsIntegral[id2 - 1];
        }
    }
    for (int i = 1; i < height; ++i)
    {
        int id1 = i * width;
        for (int j = 0; j < width; ++j)
        {
            int id2 = id1 + j;
            integral[id2] += integral[id2 - width];
            ptsIntegral[id2] += ptsIntegral[id2 - width];
        }
    }
    int wnd;
    double dWnd = 2;
    while (dWnd > 1)
    {
        wnd = int(dWnd);
        dWnd /= 2;
        for (int i = 0; i < height; ++i)
        {
            int id1 = i * width;
            for (int j = 0; j < width; ++j)
            {
                int id2 = id1 + j;
                int left = j - wnd - 1;
                int right = j + wnd;
                int top = i - wnd - 1;
                int bot = i + wnd;
                left = max(0, left);
                right = min(right, width - 1);
                top = max(0, top);
                bot = min(bot, height - 1);
                int dx = right - left;
                int dy = (bot - top) * width;
                int idLeftTop = top * width + left;
                int idRightTop = idLeftTop + dx;
                int idLeftBot = idLeftTop + dy;
                int idRightBot = idLeftBot + dx;
                int ptsCnt = ptsIntegral[idRightBot] + ptsIntegral[idLeftTop] - (ptsIntegral[idLeftBot] + ptsIntegral[idRightTop]);
                double sumGray = integral[idRightBot] + integral[idLeftTop] - (integral[idLeftBot] + integral[idRightTop]);
                if (ptsCnt <= 0)
                {
                    continue;
                }
                data[id2] = float(sumGray / ptsCnt);
            }
        }
        int s = wnd / 2 * 2 + 1;
        if (s > 201)
        {
            s = 201;
        }
        cv::GaussianBlur(depth, depth, cv::Size(s, s), s, s);
    }
}

4. 相对于单目, 双目相机的劣势?

1.配置及标定比较复杂,两个镜头都需要单独标定内参和外参矩阵,然后将两个相机联合校准计算基线,并与出厂参数进行对照,
    若相差较大,则需要重新校准;

2.双目(900--1600)成本相对于单目相机(50--200)贵;

3.双目相机是被动式数据获取,单目相机是主动式数据获取; 双目通过视差可以获取深度值,而单目需要运动才能获取深度信息;

4.双目在计算立体配准获取视差时(像素级计算,若想图像块计算则会模糊深度值),需要消耗较大的计算量。而单目不需要大量或者GPU计算;

5.所以可能就是因为从成本、计算量、实时性等方面考虑, 目前单目落地应用相比于双目要多一些。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vSLAM重读(5): vSLAM中对双目相机的数据处理及与单目相对比 的相关文章

  • vslam流程框架介绍

    平常扫地机产品上经常听说使用了vslam技术 xff0c 那么这个vslam到底是什么呢 xff0c 我们下面一起来看看 vslam是什么 xff1f VSLAM 即 Visual Simultaneous Localization and
  • VSLAM框架:ORB_SLAM2采用ROS Bag获取数据

    ORB SLAM2采用ROS Bag获取数据 前言一 ROS bag数据1 ROS bag简介2 获取数据集3 查看数据集信息 二 配置文件1 配置ros文件2 配置内参文件三 启动节点1 回放ROS bag数据集2 深度相机节点 前言 之
  • VIO/VINS/VSLAM问题定位流程与思路

    首先假设读者是了解基础VSLAM xff0c 了解VIO基础 至少要会标定 xff0c 调过几个开源系统的 先说一下双目的VINS FUSION xff0c 大部分问题都是基线造成的问题 xff0c 简单点说就是如果使用较短的基线如5cm
  • 车载VSLAM与激光雷达方案

    基于VSALM在计算机视觉领域的领先技术 xff0c 提供优异的视觉目标检测功能 提供前视视觉感知 xff0c 环视视觉感知以及APA系统的一站式ADAS功能解决方案 基于激光与视觉检测的融合结果 xff0c 覆盖更为广泛的应用场合 从特征
  • vslam

    目录 隐藏 1 SLAM 介绍 1 1 什么是SLAM 1 2 SLAM与视觉里程计 xff08 Visual Odometry xff09 1 3 SLAM和SfM 2 主流开源SLAM方案 2 1 视觉传感器 2 2 激光传感器 2 3
  • VSLAM框架对比

    xff08 一 xff09 单目VSLAM特点介绍 xff1a 1 ORB SLAM2 工作流程 xff1a 主要模块 xff1a 前端 xff1a ORB特征提取匹配 xff0c 估计相机位姿 xff1b 根据跟踪地图点数的减少选择关键帧
  • vslam介绍

    目录 隐藏 1 SLAM 介绍 1 1 什么是SLAM 1 2 SLAM与视觉里程计 xff08 Visual Odometry xff09 1 3 SLAM和SfM 2 主流开源SLAM方案 2 1 视觉传感器 2 2 激光传感器 2 3
  • vslam: 扫盲之旅

    ICCV研讨会 xff1a 实时SLAM的未来以及深度学习与SLAM的比较 http blog csdn net qq 18661939 article details 51919329 The Future of Real time SL
  • vslam从入门到入土:在ubuntu18中使用D455运行VINS-FUSION

    1 ROS安装 建议使用ROS官方网的步骤 melodic Installation Ubuntu ROS Wiki 一定要看清楚版本 ubuntu18 是 melodic 2 ceres安装 2 1依赖 sudo apt get inst
  • vSLAM重读(4): OKVIS--KeyFrame-based Visual-Inertial SLAM

    1 摘要 视觉传感器与IMU传感器互补 61 61 gt VIO系统 xff1b 由最初的以滤波为主题 xff0c 现在逐渐转换为非线性优化来实现SLAM xff1b 提出一种方法将视觉信息与IMU测量数据紧密结合 xff0c 将IMU的误
  • vSLAM重读(5): vSLAM中对双目相机的数据处理及与单目相对比

    1 双目相机概述 双目立体视觉模型 双目模型求取深度 双目立体相机分别校准可参考 ROS 单目相机 分别校准 双目立体匹配算法案例 https www cnblogs com riddick p 8486223 html https www
  • 鱼眼+红外+IMU+VSLAM+SLAM

    一 目的 1 想知道 xff1a 二 参考 1 一分钟详解鱼眼镜头标定基本原理及实现 https mp weixin qq com s VyxoTaYtYPB Bfh3JCXl1A 三 注意 四 操作
  • Vslam方案+源码,轻松搞定视觉slam

    原创 xff1a 涛涛CV 涛涛CV 今天 关注涛涛CV xff0c 设为星标 xff0c 更新不错过 VSLAM方案 目前基于视觉的SLAM技术有多种组合形式 xff08 见下表 xff09 方案 特点 TOF 成本高 xff0c 分辨率
  • 欢迎走进VSLAM

    1 开启新技术之门 SLAM xff0c 全称叫做Simultaneous Localization and Mapping xff0c 中文叫做同时定位与建图 SLAM技术发展到如今已经几十年 xff0c 目前以激光雷达作为主传感器的SL
  • ORB-SLAM2:一种开源的VSLAM方案(译文)

    摘要 xff1a ORB SLAM2是基于单目 xff0c 双目和RGB D相机的一套完整的SLAM方案 它能够实现地图重用 xff0c 回环检测和重新定位的功能 无论是在室内的小型手持设备 xff0c 还是到工厂环境的无人机和城市里驾驶的
  • VSLAM与VIO的3D建图,重定位与世界观综述

    作者 紫川Purple River 编辑 汽车人 原文链接 xff1a zhuanlan zhihu com p 592225457 点击下方卡片 xff0c 关注 自动驾驶之心 公众号 ADAS巨卷干货 xff0c 即可获取 点击进入 自
  • AirSim使用--vslam

    声明 xff1a 本文写于2020年7月 xff0c 只对当时的代码版本有效 0 下载zip 001 zip 002 zip 003等分卷文件时 xff0c 可以使用 xff1a ubuntu 如何解压 zip 001 zip 002 zi
  • ubuntu 安装Pangolin 过程

    前言 大家好 好久没有写技术博客了 在工作学习中遇到一些问题及解决方法 希望能帮助到大家 Pangolin 想必大家都非常熟悉了 这个是一款开源的OPENGL显示库 可以用来视频显示 而且开发容易 代码我们可以从Github 进行下载 ht
  • windows下编译、配置ceres库(保姆级教程)

    文章目录 前言 一 cmake安装 二 ceres 依赖库的下载 2 1 依赖库的下载 2 2 编译前准备工作 2 2 1 创建vs工程的输出文件夹 2 2 2 创建编译库的输出文件夹 2 3 编译Eigen库 2 3 1 编译Eigen3
  • 【语义】如何使用PointNet训练点云数据和点云分割(初探)

    大家好 今天给大家介绍下cvpr2017 一篇文章Pointnet 语义分割 该网络基于tensorflow 写的 非常轻巧方便 但是文章和代码有一定出入 在训练过程中出现过拟合现象 大概训练了10个小时多 1 需要准备的东东 1 Ubun

随机推荐

  • T-S模糊模型与状态反馈控制及Matlab仿真 (附代码)

    目录 一 仿射非线性系统建模 二 计算T S模糊模型子系统 三 建立推理 xff0c 验证开环特性 四 极点配置 xff0c 验证闭环特性 五 使用LMI验证稳定性 一 仿射非线性系统建模 以overhead crane system为例
  • 2022同济825自控原理

    1 求 R L C RLC R L C 电路的传递函数 2 求 M a s
  • json离线解析格式化工具

    json离线解析格式化工具 xff1a 当没有网络的时候 xff0c 可以使用该工具实现json解析格式化 https download csdn net download boboelec 11992955 工具使用效果 xff1a
  • LMI 转化与Matlab工具箱

    目录 一些结论 1 1 中给出下面两结论 lmivarcase1case2case3case4 参考 需要将一些不等式转化为LMI 一些结论 1 1 中给出下面两结论 P gt 0
  • Err:1 http://security.ubuntu.com/ubuntu bionic-security InRelease Could not resolve ‘security.ubun

    在执行apt get update命令的时候更新报错 Err 1 http security ubuntu com ubuntu bionic security InRelease Could not resolve 39 security
  • 强化学习Q-Learning算法

    强化学习Q Learning算法 前言基本概念基本概念递推关系 Q learning基本原理注意事项局限性仿真 前言 学习这个算法有一段时间了 xff0c 但是因为自己犯懒一直没有整理 现整理一下 xff0c 一方面有刚入门的同学可以参考
  • 联想拯救者Y7000P装win10与Ubuntu18.04双系统

    初衷 写这个博客的初衷是为了记录本人在联想笔记本上安装Ubuntu18 04双系统时遇到的坑 xff0c 事后装完之后发现并不是很坑 xff0c 但是如果没有遇到过此类问题 xff0c 就很难受了 xff0c 所以决定记录下来 这款笔记本安
  • 强化学习DDPG算法

    强化学习DDPG算法 前言 因为疫情一直在辗转隔离 xff0c 没心思学习 xff0c 索性整理一下学过的东西 xff0c 记一下学习笔记 xff0c 就当自我安慰了 推导部分观看了这个B站的学习视频 DDPG 与DQN不同 xff0c D
  • 最优控制 3:最优控制理论中的极小值原理与动态规划

    最优控制 3 xff1a 使用极小值原理求解最优控制问题 引言极小值原理 t f t f t f 固定的情况
  • 使用Pycharm创建一个工程

    刚刚开始学习Python xff0c 使用的IDE是PyCharm 本来想记在本子上 xff0c 可是感觉有点慢 xff0c 而且多 xff0c 因此选择在网上记录自己的笔记 哈哈 xff0c 也不知道能记多长时间 PyCharm下载安装之
  • Pycharm在windows下使用Anaconda中的Python解释器各种报错的问题

    最近几天被windows下的软件快要搞疯了 电脑装了Anaconda3 xff0c 在运行一些python程序的时候 xff0c 这些程序在anaconda的自带终端中python代码可以正常运行 但是不可以使用诸如Pychrm和VS201
  • Ubnutu16.04 系统下编译PX4固件方法

    今天开始准备在Ubuntu16 04下搭建PX4的开发环境 早就听说源代码编译的过程中有很多坑 xff0c 所以在编译源代码之前在网上搜索了很多教程 xff0c 其中这个教程写的非常详细 xff1a https blog csdn net
  • 高斯过程回归中后验概率的简单推导

    最近几天在整理高斯过程回归 Gaussian Process Regression GPR 部分的知识 xff0c 虽然还有很多问题没有搞懂 xff0c 但是有一点进展还是决定总结下来 xff0c 防止遗忘 在整理之前 xff0c 先列出我
  • mavlink增加自定义消息

    mavlink作为PX4以及APM两大开源飞控的通讯协议 xff0c 应用非常广泛 在进行开源飞控二次开发时 xff0c 增加自定义消息非常普遍 比如在offboard模式下 xff0c 将视觉避障信息或者雷达信息发送给飞控 xff0c 这
  • 【从0到1】组装深度学习台式机

    本文旨在为有从事深度学习研究的同学提供一份装机攻略 xff0c 望对您有帮助 1 前言 目前 新基建 热潮 xff0c 人工智能如火如荼 xff0c 国内大部分院校 企业都会为学生 员工配置实验集群 xff0c 但是有时候想在本地自己跑些d
  • 【ROS学习】节点运行管理launch文件的基本操作

    launch文件的概念和作用 launch 文件是一个 XML 格式的文件 xff0c 可以启动本地和远程的多个节点 xff0c 还可以在参数服务器中设置参数 launch文件的作用是 xff1a 简化节点的配置与启动 xff0c 提高RO
  • 系统提示“该设备无法启动(代码:10)”,USB设备不能开始工作怎么办?

    文章来源 xff1a https www reneelab com cn this device cannot start html 目录 原因分析解决方法一 xff1a 在设备管理器中更新驱动程序解决方法二 xff1a 重新安装有问题的U
  • printf 在Linux终端上输出彩色字体 (串口也适用)

    有时我们希望在LINUX终端上按照调试级别打印不同颜色的调试信息 xff0c 如 include lt stdio h gt define DBG PRINT format arg do fprintf stdout 34 ld d fla
  • vSLAM重读(4): OKVIS--KeyFrame-based Visual-Inertial SLAM

    1 摘要 视觉传感器与IMU传感器互补 61 61 gt VIO系统 xff1b 由最初的以滤波为主题 xff0c 现在逐渐转换为非线性优化来实现SLAM xff1b 提出一种方法将视觉信息与IMU测量数据紧密结合 xff0c 将IMU的误
  • vSLAM重读(5): vSLAM中对双目相机的数据处理及与单目相对比

    1 双目相机概述 双目立体视觉模型 双目模型求取深度 双目立体相机分别校准可参考 ROS 单目相机 分别校准 双目立体匹配算法案例 https www cnblogs com riddick p 8486223 html https www