![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
视觉SLAM
文章平均质量分 81
雨幕丶
这个作者很懒,什么都没留下…
展开
-
视觉SLAM ch13 设计SLAM系统
(一种特殊的函数,它作为参数传递给另一个函数,并在被调用函数执行完毕后被调用)如果是类的成员函数,这时想把成员函数设置给一个回调函数指针往往是不行的。:插入图像帧,提取图像特征,然后与上一帧进行光流追踪,通过光流结果计算该帧的位姿。必要时补充新的特征点并作三角化。前后端在分别的线程中处理数据,前端负责在地图中添加路标点,后端检测到地图更新以后优化路标点,并将旧的路标点删除掉,保持一定的规模。地图以hash的形式记录了所有的关键帧和对应的路标点,同时维护一个被激活的关键帧和地图点,激活的意思就是。原创 2023-05-13 20:47:00 · 1206 阅读 · 7 评论 -
opencv实现卡尔曼滤波
opencv自带程序:建立一个绕某一圆心做匀速圆周运动的小球,但是实际中它会受到系统噪声影响从而其角度和角速度有所变化,通过带有噪声的观测值(真实值+观测噪声)和匀速运动模型的预测值为输入使用KF得到估计值。原有的代码中比较的是真实值与预测值、真实值与观测值的偏差,没有用到估计值,因此我在上述代码中加入了真实值与估计值的比较。在更新阶段,滤波器利用对当前状态的观测值优化在预测阶段获得的预测值,以获得一个更精确的新估计值。x(k) = A*x(k-1) + B*u(k)+w(k) 运动方程。原创 2023-04-19 20:34:20 · 2107 阅读 · 0 评论 -
视觉SLAM ch12 建图(RGB-D)
假设每个点与临近点之间的距离是一个高斯分布,那么平均距离就是均值,并且可以根据均值和每一个距离求得标准差,那么平均距离在标准范围之外的点,可以被定义为离群点并从数据中去除。:取决与前端视觉里程计的处理方式。如果是基于特征点的视觉里程计,由于点云中没有存储特征点的信息,则无法用于基于特征点的定位方式。:点云无法直接用于避障,纯粹的点云无法表示“是否有障碍物",不过,可以在点云的基础上加工,得到更适合导航避障的地图形式。:根据估计的相机位姿,将RGB-D数据转化为点云,然后进行拼接,最终得到由离散的点组成的。原创 2023-04-17 21:38:01 · 439 阅读 · 0 评论 -
视觉SLAMch12 建图(单目)
稠密重建需要知道参考帧所有像素点的深度,由于大部分像素点都不是特征点,对于这些点通过极线搜索和快匹配方法确定在其他帧图像位置。选择最高点当投影点计算深度值,但是某个像素点不可能只被观测两次,导致计算的深度值不一样。缩小不确定度是通过如下方式进行的:不断求出三维点的坐标,更新这个分布,直到这个分布的不确定性小于你希望的阈值,就认为是收敛了,收敛以后的均值,就不再改动了,当做是你确定下来的深度值。单目通过三角化得到像素的距离,双目通过左右目的视差计算像素的距离,这两种方式称为。,书中给出了具体的计算方法,原创 2023-04-03 17:59:53 · 1006 阅读 · 1 评论 -
视觉SLAM ch11回环检测
回环检测原创 2023-02-17 16:27:51 · 829 阅读 · 0 评论 -
视觉SLAM ch10位姿图
ch9介绍了以BA为主的图优化,可以精确地优化每个相机位姿和地图点位置,但在更大场景无法实时化,ch10介绍一种简化的BA:位姿图 (pose graph)原创 2023-02-16 20:27:08 · 362 阅读 · 0 评论 -
视觉SLAM ch9代码总结
ceres实现BAg2o实现BA原创 2022-12-20 21:50:12 · 700 阅读 · 0 评论 -
视觉SLAM ch9 卡尔曼和扩展卡尔曼滤波
卡尔曼滤波和扩展卡尔曼滤波的推导原创 2022-12-13 15:10:35 · 677 阅读 · 0 评论 -
SLAM面试笔记
1. 找到当前关键帧的闭环候选关键帧 vpCandidateKFs : 闭环候选关键帧取自于与当前关键帧具有相同的BOW向量但不存在直接连接的关键帧.闭环检测原理: 若连续4个关键帧都能在数据库中找到对应的闭环匹配关键帧组,且这些闭环匹配关键帧组间是连续的,则认为实现闭环。2. 地图点融合: 将闭环关键帧组地图点投影到当前关键帧上. 将闭环关键帧组地图点投影到局部关键帧组上.若当前关键帧组在之前的连续关键帧组中找到连续关系,则当前的连续关键帧组的连续长度加 1 .基础矩阵:7个自由度,八对点求矩阵矩阵。原创 2022-10-12 19:20:18 · 468 阅读 · 0 评论 -
视觉SLAM ch8代码总结
一、LK光流1.使用LK光流用OpenCV的光流追踪特征点的运动。第一张图像中提取角点,利用光流追踪角点在第二张图像中的位置。使用cv::calcOpticalFlowPyrLK函数可以得到追踪后的点。void cv::calcOpticalFlowPyrLK ( InputArray prevImg,InputArray nextImg,InputArray prevPts,InputOutputArray nextPts,OutputArray status,原创 2022-04-03 20:29:14 · 3725 阅读 · 0 评论 -
视觉SLAM ch8 直接法
一、直接法的提出1.特征点法的缺点:①关键点的提取和描述子的匹配非常耗时。②忽略了特征点以外的所有信息。一张图像的像素有几十万,特征点只要几百个。③相机有时会运动到特征缺失的地方,比如白墙,或者空荡的走廊。这些场景特征点数量明显减少。④由于只提取特征点,因此通过特征点法只能重构出稀疏地图。2.解决这些缺点的思路:①保留特征点,但只计算关键点(必须是角点),不计算描述子。使用光流法跟踪特征点的运动,这样可以减少计算和匹配描述子带来的时间,光流本身的计算时间小于描述子的计算与匹配。原创 2022-04-03 20:57:22 · 1004 阅读 · 0 评论 -
视觉SLAMch7 课后题
课后习题1.除了ORB特征点,还有哪些特征点?说说SIFT与SURF的原理,并对比它们与ORB之间的优势。仅提取关键点:Harris角点、FAST角点、GFTT(goodFeaturesToTrack)角点既有关键点又有描述子:SIFT、SURF、ORB。Harris角点Harris角点检测是一种基于图像灰度的一阶导数矩阵检测方法。检测器的主要思想是局部自相似性/自相关性,即在某个局部窗口内图像块与在各个方向微小移动后的窗口内图像块的相似性。GFTT角点调用的是Shi-Toma原创 2022-03-27 22:04:43 · 3499 阅读 · 1 评论 -
视觉SLAM ch7代码总结(二)
目录一、求解对极约束求解相机运动二、三角测量一、求解对极约束求解相机运动1.特征提取与匹配函数//特征提取和匹配void find_feature_matches( const Mat &img_1,const Mat &img_2, vector<KeyPoint> &keypoints1, vector<KeyPoint> &keypoints2, ve原创 2022-03-23 17:09:24 · 5386 阅读 · 0 评论 -
视觉SLAM ch7代码总结(一)
目录一、OpenCV的 ORB特征二、手写ORB特征一、OpenCV的 ORB特征1.Keypoint类opencv中Keypoint类的默认构造函数为:CV_WRAP KeyPoint() : pt(0,0), size(0), angle(-1), response(0), octave(0), class_id(-1) {} pt(x,y):关键点的点坐标; size():该关键点邻域直径大小;angle:角度,表示关键点的方向,值为[0,360),负值表示不使原创 2022-03-14 17:00:05 · 4049 阅读 · 1 评论 -
视觉SLAM ch7 计算相机运动(求位姿)
目录计算相机运动一、2D-2D:对极几何二、三角测量三、3D-2D:PnP四、3D-3D:ICP计算相机运动在已经有匹配好的点对基础上来估计相机的运动(其实就是求R和t)根据相机不同的种类有以下几种情况:1.相机为单目时,只有2D的像素坐标(缺少了深度信息),因此问题就是根据两组2D点估计相机运动,用对极几何解决。2.相机为双目、RGB-D时,或者通过某种方式得到了距离信息,问题就是根据两组3D点估计相机运动,通常用ICP解决。3.如果一组为3D,...原创 2022-03-23 17:09:03 · 5513 阅读 · 0 评论 -
视觉SLAM ch7 ORB特征点
一、视觉里程计方法:特征点法和光流法。(视觉里程计的核心是如何根据图像估计相机运动)1.1 特征点法:提取和匹配特征点,然后根据配对的特征点估计相机的运动。特征点由关键点和描述子组成。关键点是指特征点在图像里的位置,有些特征点还具有朝向、大小信息;描述子通常是一个向量,描述了该关键点周围像素的信息。1.2 常用的特征点方法:一、SIFT(尺度不变特征变换),充分考虑了图像变换过程中出现的光照、尺度、旋转等变化,但需要大量的计算。二、SURF(加速稳健特征),SURF算法是SIFT算法原创 2022-03-14 10:54:46 · 2711 阅读 · 0 评论 -
视觉SLAM ch6代码总结
一、手写高斯牛顿法三个步骤:1、先根据模型生成x,y的真值,并在真值中添加高斯分布的噪声2、使用高斯牛顿法进行迭代3、求解高斯牛顿法的增量方程增量方程的推到过程图片来源 该公式等同于133页6.41式Σ 是 高斯噪声的方差CMakeLists.txtcmake_minimum_required(VERSION 3.0)project(ch6)set(CMAKE_BUILD_TYPE Release)set(CMAKE_CXX_FLAGS "-std=c+...原创 2022-02-24 16:44:15 · 4707 阅读 · 2 评论 -
视觉SLAM ch6 非线性优化
一、首先理解运动方程和观测方程(1)运动方程: x表示相机的位姿,每个时刻位姿记为x1, x2...... xk,构成了运动的轨迹。uk 是传感器的输入;wk 是噪声,假设噪声服从高斯分布。运动方程的意义是: k-1 到 k 时刻,机器人位姿x 是如何变化的。 SLAM中的定位问题就是估计 x的值。区分位姿和位置:位姿代表位置和姿态。任何一个刚体在空间坐标系(OXYZ)中,可以用位置和姿态来精确、唯一表示其位置状态。位姿是六自由的量,包括旋转和平移;位置是三维的量,表示具体位置(X,原创 2022-02-17 18:09:17 · 2067 阅读 · 1 评论 -
视觉SLAM ch5代码总结(三)
RGB-D视觉(1)根据内参计算一对RGB-D图片对应的点云(2)根据每张图的相机位姿(外参)把点云加起来,组成地图遍历图像的每个像素,并将深度图的深度信息提取出来,将像素点归一化后,乘上深度信息就得到了相机坐标系下的点,在左乘T 就得到了世界坐标系下的点1. 相机的内外参数 99-1002. return 0 return 1 区别return 1;//return 0 代表程序正常退出,return 1代表程序异常退出!3.boost/formatc++中的b原创 2022-02-15 12:12:56 · 1531 阅读 · 4 评论 -
视觉SLAM ch5代码总结(二)续
前面代码是使用灰度图实现去畸变和双目视觉的,本部分内容用彩色图来实现双目视觉。视觉SLAM学习【7】-----基于ubuntu16.04的深度及彩色图像立体匹配,并生成深度和彩色3D点云 - 古月居 (guyuehome.com)https://www.guyuehome.com/23903代码就不讲了,讲一下我写的时候遇到一些问题。一、彩色图的左右两图像素一定要相同,截图完以后使用画图工具修改像素保持纵横比取消对勾,水平和垂直像素两张图一样就行,不然使用SGBM算法会报错,错误信息提示两.原创 2021-12-23 10:17:28 · 190 阅读 · 2 评论 -
视觉SLAM ch5代码总结(二)
图像去畸变CMakeLists.txtcmake_minimum_required(VERSION 3.10)project(basics)#Eigeninclude_directories("/usr/include/eigen3")#opencvfind_package(OpenCV REQUIRED)#添加头文件include_directories(${OpenCV_INCLUDE_DIRS})add_executable(imageBasics imageBasic原创 2021-12-22 10:25:38 · 5846 阅读 · 0 评论 -
视觉SLAM ch5代码总结(一)
1.int argc,char **argvargc 表示输入参数的个数 *argv 是指针数组 存放输入的参数(可能比较抽象,看下面例子会清晰点)例如 make 以后再终端输入./imageBasics ../ubuntu.pngargc = 2argv[0] 是./imageBasics ,argv[1] 是 ../ubuntu.pngcout<<argc<<" "<<argv[0]<<" "<<...原创 2021-12-17 20:39:28 · 4203 阅读 · 2 评论 -
视觉SLAM ch5相机与图像
世界坐标系、相机坐标系 、图像(物理成像平面)坐标系(Z=1, 归一化坐标系),像素坐标系这四个坐标系的坐标依次为 Pw , Pc , , Puv (二维平面内)注意书中的 P 就是这里的 Pc,看的时候不认真,把Pw 和 Pc 搞混了(1) Pc = R Pw + t = [X,Y,Z](XYZ是相机坐标系坐标) 或者 Pc = Tcw Pw 从世界坐标系变换到相机坐标系(2)Pw = R Pc + t 或者 P...原创 2021-12-16 16:00:23 · 322 阅读 · 0 评论 -
视觉SLAM ch4李群和李代数
这一部分我把书中的内容认认真真的看了三遍,高博书中已经写的很详细了,不懂的地方去网上找找相关资料就没什么大问题了。看完后要明白几个问题 1.为什么李群要转换成李代数计算?有什么优势?为了求导。使用李代数的一个动机是为了进行优化,而在优化过程中导数是很重要的信息 2.为什么引入指数和对数映射?跟李代数和李群又是什么关系? 为了更好的计算李群和李代数引入了指数和对数映射 李群通过对数映射转化为李代数,反过来李代数通...原创 2021-12-14 17:30:03 · 1095 阅读 · 0 评论 -
视觉SLAM ch3课后题 (笔记)
(1)旋转矩阵,变换矩阵,旋转向量,欧拉角,四元数之间的相互联系1.四元数---->旋转向量: v_rotate = AngleAxisd (q)2.旋转向量----->四元数: q = Quaterniond (v_rotate)3.旋转向量----->旋转矩阵: R = v_rotate.matrix() 或 R = v_rotate.toRotationMatrix()4.旋转矩阵----->旋转向量: v_rotate = AngleAxisd (R原创 2021-12-10 20:53:45 · 210 阅读 · 0 评论 -
视觉SLAM ch3代码总结 (三)
(1)重载运算符<< 和 >>为什么要重载运算符?C++语言中已经给出的运算符(包括算数运算符和逻辑运算符)只是针对C++语言中已经给定的数据类型进行运算,假如我们想要对我们的自定义数据类型进行运算的话,则需要重载运算符,我们可以把重载运算符理解成对已有的运算符的一种重新定义。语法格式如下<返回类型> operator <运算符符号>(<参数>){ <定义>;}举个栗子 重载运算符<struct.原创 2021-12-09 19:50:50 · 244 阅读 · 0 评论 -
视觉SLAM ch3代码总结 (二)
coordinateTransform.cpp首先小萝卜一号坐标变换到世界坐标系Pw = T w1 * P 1其次世界坐标系再变换到小萝卜二号坐标系P2 = T 2w * P w所以 P2 = T 2w * Tw1 * P1T2w 是使用四元数q2初始换欧式变换矩阵 Isometry3d T2w(q2);Tw1 = T1w的逆矩阵 初始化和上面代码一样 Isometry3d T1w(q1);在加上平移向量 T1w.pretranslate...原创 2021-12-08 21:31:33 · 1083 阅读 · 0 评论 -
视觉SLAM ch3 代码总结(一)
useGeometry代码分别用几种旋转方式如 angle axis 、matrix 、变换矩阵、四元数旋转一个向量v(1,0,0)最后得出的结果就是旋转以后的 v丶坐标 。不过变换矩阵的结果加入了平移向量。在书中不懂的地方自己进行了注释...原创 2021-12-08 10:44:23 · 330 阅读 · 0 评论 -
关于slam14讲 ch5 imageBasics
第一种使用vim进行编辑程序写好以后退后输入下面的指令g++ opencv_test.cpp -o a.out `pkg-config opencv --libs --cflags opencv`会生成 a.out文件./test.out 1.jpg //1.jpg 是图片 和cpp文件放在同一目录下第二种在CMakeLists.txt 写set( CMAKE_CXX_FLAGS "-std=c++11")project(imageBasics)...原创 2021-10-11 16:04:41 · 628 阅读 · 1 评论 -
关于eigen3使用时头文件报错问题
视觉SLAM十四讲书中头文件#include<Eigen/Core>改为#include<eigen3/Eigen/Core>原创 2021-10-08 21:18:34 · 938 阅读 · 1 评论