
SLAM学习
参考《视觉SLAM十四讲:从理论到实践》
JoannaJuanCV
研究方向:图像处理、立体视觉、3D重建;人脸识别等,专注于计算机视觉在无人机和机器人领域的研究和应用。
展开
-
Ubuntu14.04+opencv3.4.6:半稠密直接法估计相机运动
把先前的稀疏特征点改成带有明显梯度的像素,代码实现如下所示,于是在图优化中会增加许多的边。这些边都会参与估计相机位姿的优化问题,利用大量的像素而不单单是稀疏的特征点。由于我们并没有使用所有的像素,所以这种方式又称为半稠密方法(Semi-dense)。// select the pixels with high gradiants for ( int x=10; x&...原创 2019-07-16 14:47:57 · 609 阅读 · 0 评论 -
Ubuntu 14.04 安装g2o
从 github 下载:https://github. com/RainerKuemmerle/g2o安装依赖项sudo apt-get install libqt4-dev qt4-qmake libqglviewer-dev libsuitesparse-dev libcxsparse3.1.2安装 g2ocd g2omkdir buildcd buildcm...原创 2019-07-15 13:42:48 · 361 阅读 · 0 评论 -
SLAM学习:三维空间刚体变换(1)
1. 欧式变换相机运动是一个刚体运动,它保证了同一个向量在各个坐标系下的长度和夹角都不会发生变化。这种变换称为欧氏变换。一个欧式变换由一个旋转和一个平移两部分组成;其中,旋转矩阵表征绕各个坐标轴所旋转的角度,平移矩阵表征沿各个坐标轴移动的大小;如:考虑世界坐标系中的向量 a,经过一次 旋转(用 R 描述)和一次平移 t 后,得到了 a′,那么把旋转和平移合到一起,有: a′ =...原创 2019-07-11 16:23:32 · 1772 阅读 · 0 评论 -
两两帧的视觉里程计
1. TUM数据集https://vision.in.tum.de/data/datasets/rgbd-dataset/download选择fr1/rpy下载:在解压后,你将看到以下这些文件: rgb.txt 和 depth.txt 记录了各文件的采集时间和对应的文件名。 rgb/ 和 depth/目录存放着采集到的 png 格式图像文件。彩色图像为八位三通道,深度图为 ...原创 2019-07-16 20:15:13 · 873 阅读 · 1 评论 -
Ubuntu Panglolin 安装
学习视觉Slam十四讲到第三章的可视化演示的时候需要Panglolin的使用,因此在Githup上下载了安装包:https://github.com/stevenlovegrove/Pangolin具体安装步骤可参考解压后的Pangolin文件夹中的README.txt文档内容。如果想安装最新的版本,可以到上面的网址上下载,但是安装过程要参考对应的README.txt文档。不同版本可能会有些变...原创 2019-07-12 08:53:42 · 276 阅读 · 0 评论 -
SLAM学习:李群李代数
1.李群李群是具有连续(光滑)性质的群;它既是群也是流行;直观上看,一个刚体能够连续的在空间中运动,故SO(3)和SE(3)都是李群。(注:SO(3)是特殊正交群 SE(3)是特殊欧式群,由于旋转矩阵R是3乘3的维度,但自由度的约束只有3个自由度,所以旋转矩阵R在9维空间中是一个连续的3维曲面或流形)三维旋转矩阵构成了 特殊正交群 SO(3),而变换矩阵构成了特殊欧氏群 SE(3):...原创 2019-07-12 10:03:26 · 606 阅读 · 0 评论 -
Ubuntu14.04+opencv3.4.6:三角测量
在单目 SLAM 中,仅 通过单张图像无法获得像素的深度信息,我们需要通过三角测量(Triangulation)(或三 角化)的方法来估计地图点的深度。 如下图所示,三角测量是指,通过在两处观察同一个点的夹角,确定该点的距离。考虑图像 I1 和 I2,以左图为参考,右图的变换矩阵为 T。相机光心 为 O1 和 O2。在 I1 中有特征点 p1,对应 I2 中有特征点 p2。理论上直线 ...原创 2019-07-15 15:41:50 · 1734 阅读 · 0 评论 -
Ubuntu opencv基本图像操作
安装包:从 http: //opencv.org/downloads.html 中下载,选择 OpenCV for Linux 版本即可;在编译之前,先来安装 OpenCV 的依赖项: sudo apt-get install build-essential libgtk2.0-dev libvtk5-dev libjpeg-dev libtiff4-dev libjasper-dev...原创 2019-07-12 10:38:31 · 646 阅读 · 3 评论 -
Ubuntu14.04+opencv3.4.6:Lucas-Kanade 光流
Lucas-Kanade 光流光流是一种描述像素随着时间,在图像之间运动的方法,如图所示。随着时间的经过,同一个像素会在图像中运动,而我们希望追踪它的运动过程。计算部分像素运动的称为稀疏光流,计算所有像素的称为稠密光流。稀疏光流以 Lucas-Kanade 光流为表,并可以在 SLAM 中用于跟踪特征点位置。光流法的前提假设:(1)相邻帧之间的亮度恒定;(2)相邻视频帧的取...原创 2019-07-16 14:10:06 · 278 阅读 · 0 评论 -
Ubuntu14.04+opencv3.4.6:对极约束求解相机运动
以上图为例,我们希望求取两帧图像 I1, I2 之间的运动,设第一帧到第二帧的运动为 R, t。两个相机中心分别为 O1, O2。现在,考虑 I1 中有一个特征点 p1,它在 I2 中对应着特征点 p2。我们晓得这俩是通过特征匹配得到的。如果匹配正确,说明它们确实是同一个 空间点在两个成像平面上的投影。连线O1p1 和连线 O2p2 在三维空间中会相交于点 P;候点 O1, O2,...原创 2019-07-15 14:42:37 · 431 阅读 · 0 评论 -
Ubuntu14.04+opencv3.4.6:3D-3D位姿估计
假设我们有一组配对好的 3D 点(比如我 们对两个 RGB-D 图像进行了匹配): P = {p1, . . . , pn}, P ′ = {p′1 , . . . , p′n}, 现在,想要找一个欧氏变换 R, t,使得: ∀i, pi = Rp′i + t. 这个问题可以用迭代最近点(Iterative Closest Point, ICP)求解;3D-3D 位姿估计问题中,并...原创 2019-07-15 17:57:54 · 554 阅读 · 1 评论 -
Ubuntu14.04+opencv3.4.6:ORB特征提取与匹配
提取 ORB 特征分为两个步骤: 1. FAST 角点提取:找出图像中的” 角点”。相较于原版的 FAST, ORB 中计算了特征点的主方向,为后续的 BRIEF 描述子增加了旋转不变特性。 2. BRIEF 描述子:对前一步提取出特征点的周围图像区域进行描述。#include <iostream>#include <opencv2/core/core.hpp&g...原创 2019-07-15 14:16:15 · 710 阅读 · 0 评论 -
地图视觉里程计-VisualOdometry注释说明
在两两帧间比较时,我们只计算参考帧与当前帧之间的特征匹配和运动关系,在计算之后把当前帧设为新的参考帧。而在使用地图的 VO 中,每个帧为地图贡献一些信息,比方说添加新的特征点或更新旧特征点的位置估计。地图中的特征点位置往往是使用世界坐标的。因此,当前帧到来时,我们求它和地图之间的特征匹配与运动关系,即直接计算了 Tcw。 这样做的好处是,我们能够维护一个不断更新的地图。只要地图是正确的,即使中...原创 2019-07-17 13:33:04 · 851 阅读 · 0 评论 -
Ubuntu14.04+opencv3.4.6:PnP求解
PnP(Perspective-n-Point)是求解 3D 到 2D 点对运动的方法。它描述了当我们知道n 个 3D 空间点 (X,Y,Z) 以及它们的投影位置 (x,y) 时,如何估计相机所在的位姿。PnP 问题有很多种求解方法,例如用三对点估计位姿的 P3P 、直接线性变换(DLT)、EPnP。此外,还能用非线性优化的方式,构建最小二乘问题并迭代求解,也就是万金油式的 Bundle ...原创 2019-07-15 16:52:26 · 617 阅读 · 0 评论 -
SLAM学习:三维空间刚体变换(2)
1. 旋转向量矩阵表示方式有以下几个缺点: (1)SO(3) 的旋转矩阵有九个量,但一次旋转只有三个自由度。因此这种表达方式是冗 余的。同理,变换矩阵用十六个量表达了六自由度的变换。(2)旋转矩阵自身带有约束:它必须是个正交矩阵,且行列式为 1。变换矩阵也是如此。当 我们想要估计或优化一个旋转矩阵/变换矩阵时,这些约束会使得求解变得更困难。对于坐标系的旋转, 任意旋转都可以用一个旋...原创 2019-07-11 17:21:43 · 1280 阅读 · 0 评论 -
四元数的旋转公式推导
转载 2019-07-11 19:27:43 · 521 阅读 · 0 评论 -
视觉里程计-直接法
直接法的引入 SLAM 主要分为视觉前端和优化后端。前端也称为 视觉里程计(VO)。它根据相邻图像的信息,估计出粗略的相机运动,给后端提供较好的初始值。 VO 的实现方法,按是否需要提取特征,分为特征点法的前端以及不提特征的直接法前端。尽管特征点法在视觉里程计中占据主流地位,研究者们认识它至少有以下几个缺点:关键点的提取与描述子的计算非常耗时。实践当中,SIFT目前在CPU上是无法实...原创 2019-07-15 19:49:44 · 3526 阅读 · 1 评论 -
Ubuntu14.04+opencv3.4.6:稀疏直接法估计相机运动
使用 g2o求解直接法把直接法抽象成一个图优化问题。显然,直接法是由以下顶点和边组成的:1. 优化变量为一个相机位姿,因此需要一个位姿顶点。由于我们在推导中使用了李代数,故程序中使用李代数表达的 SE(3) 位姿顶点。2. 误差项为单个像素的光度误差。由于整个优化过程中 I1(p1) 保持不变,我们可以把它当成一个固定的预设值,然后调整相机位姿,使 I2(p2) 接近这个值。于是,这种...原创 2019-07-16 14:32:06 · 1134 阅读 · 0 评论 -
Pangolin在cmake时报“Could NOT find GLEW”错误
CMake Error at CMakeModules/FindGLEW.cmake:51 (MESSAGE):Could not find GLEW安装以下库,可解决该问题:sudo apt-get install libx11-dev libxmu-dev libglu1-mesa-dev libgl2ps-dev libxi-dev g++ libzip-dev libpng1...原创 2019-07-11 18:21:48 · 7016 阅读 · 6 评论 -
Ceres 曲线拟合
Ceres 求解的最小二乘问题最一般的形式如下(带边界的核函数最小二乘):可以看到,目标函数由许多平方项,经过一个核函数 ρ(·) 之后,求和组成。在最简 单的情况下,取 ρ 为恒等函数,则目标函数即为许多项的平方和。在这个问题中,优化变量为 x1, . . . , xn,fi 称为代价函数(Cost function),在 SLAM 中亦可理解为误差项。lj和 uj 为第 j 个优化变量...原创 2019-07-15 11:48:22 · 1237 阅读 · 1 评论 -
本征矩阵和基础矩阵
原文:http://blog.youkuaiyun.com/xiaoyinload/article/details/49000855本征矩阵E:它包含了物理空间中两个摄像机相关的旋转(R)和平移信息(T)。T和R描述了...转载 2019-07-15 14:38:06 · 3979 阅读 · 1 评论 -
执行报错Pangolin X11: Unable to retrieve framebuffer options
terminate called after throwing an instance of 'std::runtime_error' what(): Pangolin X11: Unable to retrieve framebuffer optionsAborted (core dumped)解决办法:https://github.com/stevenlovegrove/Pan...原创 2019-07-12 08:53:25 · 1099 阅读 · 0 评论 -
SLAM学习:Eigen几何模块测试
数据结构: • 旋转矩阵(3 × 3):Eigen::Matrix3d。 • 旋转向量(3 × 1):Eigen::AngleAxisd。 • 欧拉角(3 × 1):Eigen::Vector3d。 • 四元数(4 × 1):Eigen::Quaterniond。 • 欧氏变换矩阵(4 × 4):Eigen::Isometry3d。 • 仿射变换(4 × 4):Eigen:...原创 2019-07-11 17:37:34 · 407 阅读 · 1 评论 -
ubuntu Ceres安装
下载 Ceres:https://github.com/ceres-solver/ceres-solver安装依赖项sudo apt-get install liblapack-dev libsuitesparse-dev libcxsparse3.1.2 libgflags-dev libgoogle-glog-dev libgtest-dev安装 Cerescd cere...原创 2019-07-13 18:13:03 · 1135 阅读 · 0 评论 -
opencv 函数triangulatePoints():Reconstructs points by triangulation
C++: void triangulatePoints(InputArray projMatr1, InputArray projMatr2, InputArray projPoints1, InputArray projPoints2, OutputArray points4D)Python: cv2.triangulatePoints(projMatr1, projMatr2, projP...原创 2019-07-15 15:28:25 · 5675 阅读 · 1 评论 -
ubuntu安装OPENCV的VIZ模块
缺少viz模块报错:fatal error: opencv2/viz/viz.hpp: No such file or directory#include <opencv2/viz/viz.hpp>1、找到自己当时解压后的opencv3.4.6源码,如果编译过会有个build文件夹:cd build2、安装依赖sudo apt-get isntal...原创 2019-07-16 17:26:32 · 1431 阅读 · 0 评论 -
SLAM学习:拼接点云
根据 RGB-D 图像和相机内参,我们可以计算任何一个像素在相机坐标系下的位置。同时,根据相机位姿,又能计算这些像素在世界坐标系下的位置。如果把所有像素的空间坐标都求出来,相当于构建一张类似于地图的东西。本程序提供了五张 RGB-D 图像,并 且知道了每个图像的内参和外参:准备了五对图像,位于 slambook/ch5/joinMap 中。在 color/下有 1.png 到 5.png ...原创 2019-07-13 18:13:15 · 1709 阅读 · 0 评论 -
SLAM学习:视觉SLAM框架
视觉SLAM经典框架 图1 整体视觉SLAM流程图整个视觉SLAM流程包括以下步骤:传感器信息读取。在视觉SLAM中主要为相机图像信息的读取和预处理。如果是在机器人中,还可能有码盘、惯性传感器等信息的读取和同步。 视觉里程计(Visual Odometry,VO)。视觉里程计的任务是估算相邻图像间相...原创 2019-07-11 15:18:05 · 937 阅读 · 0 评论