
视觉SLAM
文章平均质量分 81
雨幕丶
这个作者很懒,什么都没留下…
展开
-
相机标定笔记(单、双、鱼眼)
opencv 中相机标定calibrateCamera() 接口的实现,总结如下:(1. 因为镜头畸变的影响比较小,首先假定相机是理想无畸变的,根据闭式解来计算初始的相机内参;2. 估计相机位姿,也就是求解相机外参,opencv使用solvePnP来实现,支持迭代和 P3P 等多种算法求解;3. 应用最小二乘求解实际的径向畸变系数(4. 根据求解的内外参对objectPoints进行重投影,应用全局Levenberg-Marquardt优化算法来最小化重投影和原投影点之间的误差。原创 2025-04-07 00:03:48 · 876 阅读 · 0 评论 -
视觉SLAM ch13 设计SLAM系统
(一种特殊的函数,它作为参数传递给另一个函数,并在被调用函数执行完毕后被调用)如果是类的成员函数,这时想把成员函数设置给一个回调函数指针往往是不行的。:插入图像帧,提取图像特征,然后与上一帧进行光流追踪,通过光流结果计算该帧的位姿。必要时补充新的特征点并作三角化。前后端在分别的线程中处理数据,前端负责在地图中添加路标点,后端检测到地图更新以后优化路标点,并将旧的路标点删除掉,保持一定的规模。地图以hash的形式记录了所有的关键帧和对应的路标点,同时维护一个被激活的关键帧和地图点,激活的意思就是。原创 2023-05-13 20:47:00 · 1341 阅读 · 7 评论 -
opencv实现卡尔曼滤波
opencv自带程序:建立一个绕某一圆心做匀速圆周运动的小球,但是实际中它会受到系统噪声影响从而其角度和角速度有所变化,通过带有噪声的观测值(真实值+观测噪声)和匀速运动模型的预测值为输入使用KF得到估计值。原有的代码中比较的是真实值与预测值、真实值与观测值的偏差,没有用到估计值,因此我在上述代码中加入了真实值与估计值的比较。在更新阶段,滤波器利用对当前状态的观测值优化在预测阶段获得的预测值,以获得一个更精确的新估计值。x(k) = A*x(k-1) + B*u(k)+w(k) 运动方程。原创 2023-04-19 20:34:20 · 2690 阅读 · 0 评论 -
视觉SLAM ch12 建图(RGB-D)
假设每个点与临近点之间的距离是一个高斯分布,那么平均距离就是均值,并且可以根据均值和每一个距离求得标准差,那么平均距离在标准范围之外的点,可以被定义为离群点并从数据中去除。:取决与前端视觉里程计的处理方式。如果是基于特征点的视觉里程计,由于点云中没有存储特征点的信息,则无法用于基于特征点的定位方式。:点云无法直接用于避障,纯粹的点云无法表示“是否有障碍物",不过,可以在点云的基础上加工,得到更适合导航避障的地图形式。:根据估计的相机位姿,将RGB-D数据转化为点云,然后进行拼接,最终得到由离散的点组成的。原创 2023-04-17 21:38:01 · 539 阅读 · 0 评论 -
视觉SLAMch12 建图(单目)
稠密重建需要知道参考帧所有像素点的深度,由于大部分像素点都不是特征点,对于这些点通过极线搜索和快匹配方法确定在其他帧图像位置。选择最高点当投影点计算深度值,但是某个像素点不可能只被观测两次,导致计算的深度值不一样。缩小不确定度是通过如下方式进行的:不断求出三维点的坐标,更新这个分布,直到这个分布的不确定性小于你希望的阈值,就认为是收敛了,收敛以后的均值,就不再改动了,当做是你确定下来的深度值。单目通过三角化得到像素的距离,双目通过左右目的视差计算像素的距离,这两种方式称为。,书中给出了具体的计算方法,原创 2023-04-03 17:59:53 · 1303 阅读 · 1 评论 -
视觉SLAM ch11回环检测
回环检测原创 2023-02-17 16:27:51 · 914 阅读 · 0 评论 -
视觉SLAM ch10位姿图
ch9介绍了以BA为主的图优化,可以精确地优化每个相机位姿和地图点位置,但在更大场景无法实时化,ch10介绍一种简化的BA:位姿图 (pose graph)原创 2023-02-16 20:27:08 · 440 阅读 · 0 评论 -
视觉SLAM ch9代码总结
ceres实现BAg2o实现BA原创 2022-12-20 21:50:12 · 842 阅读 · 0 评论 -
视觉SLAM ch9 卡尔曼和扩展卡尔曼滤波
卡尔曼滤波和扩展卡尔曼滤波的推导原创 2022-12-13 15:10:35 · 794 阅读 · 0 评论 -
SLAM面试笔记
本质矩阵:尺度等价性,5个自由度,最少可以用5对点求解;基础矩阵:尺度等价性、秩为2,7个自由度,八对点求基础矩阵;单应性矩阵:尺度等价性,8个自由度,一对点提供两个约束方程,需要四对点求单应性矩阵。描述了两个平面的映射关系,已知两个平面的图像坐标p1和p2,则p2 = H p1:只有旋转没有平移的时候可以用单应性矩阵求R。因为t为0,E也将为0,导致无法求解R。PnP(P3P)是3D-2D的位姿求解方式,即需要已知匹配的3D点和图像2D点。估计相机位姿时通常需要PnP给出相机初始位姿,原创 2022-10-12 19:20:18 · 564 阅读 · 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 · 3875 阅读 · 0 评论 -
视觉SLAM ch8 直接法
一、直接法的提出1.特征点法的缺点:①关键点的提取和描述子的匹配非常耗时。②忽略了特征点以外的所有信息。一张图像的像素有几十万,特征点只要几百个。③相机有时会运动到特征缺失的地方,比如白墙,或者空荡的走廊。这些场景特征点数量明显减少。④由于只提取特征点,因此通过特征点法只能重构出稀疏地图。2.解决这些缺点的思路:①保留特征点,但只计算关键点(必须是角点),不计算描述子。使用光流法跟踪特征点的运动,这样可以减少计算和匹配描述子带来的时间,光流本身的计算时间小于描述子的计算与匹配。原创 2022-04-03 20:57:22 · 1077 阅读 · 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 · 3558 阅读 · 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 · 5522 阅读 · 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 · 4146 阅读 · 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 · 5809 阅读 · 0 评论 -
视觉SLAM ch7 ORB特征点
一、视觉里程计方法:特征点法和光流法。(视觉里程计的核心是如何根据图像估计相机运动)1.1 特征点法:提取和匹配特征点,然后根据配对的特征点估计相机的运动。特征点由关键点和描述子组成。关键点是指特征点在图像里的位置,有些特征点还具有朝向、大小信息;描述子通常是一个向量,描述了该关键点周围像素的信息。1.2 常用的特征点方法:一、SIFT(尺度不变特征变换),充分考虑了图像变换过程中出现的光照、尺度、旋转等变化,但需要大量的计算。二、SURF(加速稳健特征),SURF算法是SIFT算法原创 2022-03-14 10:54:46 · 2757 阅读 · 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 · 4865 阅读 · 2 评论 -
视觉SLAM ch6 非线性优化
一、首先理解运动方程和观测方程(1)运动方程: x表示相机的位姿,每个时刻位姿记为x1, x2...... xk,构成了运动的轨迹。uk 是传感器的输入;wk 是噪声,假设噪声服从高斯分布。运动方程的意义是: k-1 到 k 时刻,机器人位姿x 是如何变化的。 SLAM中的定位问题就是估计 x的值。区分位姿和位置:位姿代表位置和姿态。任何一个刚体在空间坐标系(OXYZ)中,可以用位置和姿态来精确、唯一表示其位置状态。位姿是六自由的量,包括旋转和平移;位置是三维的量,表示具体位置(X,原创 2022-02-17 18:09:17 · 2261 阅读 · 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 · 1582 阅读 · 4 评论 -
视觉SLAM ch5代码总结(二)续
前面代码是使用灰度图实现去畸变和双目视觉的,本部分内容用彩色图来实现双目视觉。视觉SLAM学习【7】-----基于ubuntu16.04的深度及彩色图像立体匹配,并生成深度和彩色3D点云 - 古月居 (guyuehome.com)https://www.guyuehome.com/23903代码就不讲了,讲一下我写的时候遇到一些问题。一、彩色图的左右两图像素一定要相同,截图完以后使用画图工具修改像素保持纵横比取消对勾,水平和垂直像素两张图一样就行,不然使用SGBM算法会报错,错误信息提示两.原创 2021-12-23 10:17:28 · 221 阅读 · 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 · 6718 阅读 · 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 · 4267 阅读 · 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 · 355 阅读 · 0 评论 -
视觉SLAM ch4李群和李代数
这一部分我把书中的内容认认真真的看了三遍,高博书中已经写的很详细了,不懂的地方去网上找找相关资料就没什么大问题了。看完后要明白几个问题 1.为什么李群要转换成李代数计算?有什么优势?为了求导。使用李代数的一个动机是为了进行优化,而在优化过程中导数是很重要的信息 2.为什么引入指数和对数映射?跟李代数和李群又是什么关系? 为了更好的计算李群和李代数引入了指数和对数映射 李群通过对数映射转化为李代数,反过来李代数通...原创 2021-12-14 17:30:03 · 1156 阅读 · 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 · 236 阅读 · 0 评论 -
视觉SLAM ch3代码总结 (三)
(1)重载运算符<< 和 >>为什么要重载运算符?C++语言中已经给出的运算符(包括算数运算符和逻辑运算符)只是针对C++语言中已经给定的数据类型进行运算,假如我们想要对我们的自定义数据类型进行运算的话,则需要重载运算符,我们可以把重载运算符理解成对已有的运算符的一种重新定义。语法格式如下<返回类型> operator <运算符符号>(<参数>){ <定义>;}举个栗子 重载运算符<struct.原创 2021-12-09 19:50:50 · 268 阅读 · 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 · 1190 阅读 · 0 评论 -
视觉SLAM ch3 代码总结(一)
useGeometry代码分别用几种旋转方式如 angle axis 、matrix 、变换矩阵、四元数旋转一个向量v(1,0,0)最后得出的结果就是旋转以后的 v丶坐标 。不过变换矩阵的结果加入了平移向量。在书中不懂的地方自己进行了注释...原创 2021-12-08 10:44:23 · 412 阅读 · 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 · 698 阅读 · 1 评论 -
关于eigen3使用时头文件报错问题
视觉SLAM十四讲书中头文件#include<Eigen/Core>改为#include<eigen3/Eigen/Core>原创 2021-10-08 21:18:34 · 1193 阅读 · 1 评论