![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
视觉SLAM从入门到实践
司南牧
立志让初学者跨界学编程/算法/AI机器人无障碍专注零基础教程,知乎@司南牧
展开
-
[易懂]如何真正理解SLAM中的BA中的扰动法求导泰勒展开
∂(Rp)∂ξ=limΔξ→0exp(Δξ^)exp(ξ^)p−exp(ξ^p)Δξ≈limΔξ→0(1+Δξ^)exp(ξ^)p−exp(ξ^p)Δξ=limΔξ→0exp(ξ^p)+Δξ^exp(ξ^)p−exp(ξ^p)Δξ=limΔξ→0Δξ^exp(ξ^)pΔξ=limΔξ→0Δξ^RpΔξ=limΔξ→0−(Rp)^ΔξΔξ=−(Rp)^>利用叉乘的性质交换\fra...原创 2020-02-19 16:40:53 · 823 阅读 · 2 评论 -
如何理解PnP问题的DLT解法以及Python编程实践
PnP问题的DLT解法欢迎关注知乎@司南牧已知:上一帧相机坐标系下的点的三维齐次坐标QQQ,和,那nnn个点在当前帧中的二维齐次坐标qqq, 和相机内参矩阵KKK。待求解变量 :当前帧相对上一帧的位姿变换矩阵[R∣t][R|t][R∣t] 。约束方程:K[R∣t]Q=λqK[R|t]Q = \lambda qK[R∣t]Q=λq我们记[R∣t]=[a11a12a13a14a21a...原创 2020-02-19 16:37:59 · 3792 阅读 · 2 评论 -
如何理解SLAM三维重建中的DLT算法求解单应矩阵Python实践代码
# -*- coding: utf-8 -*-"""Created on Thu Dec 5 20:22:04 2019@author: 知乎@司南牧"""import numpy as nppoints1 = np.array([ [1,1], [2,3], [4,8], ...原创 2019-12-05 21:26:44 · 1373 阅读 · 0 评论 -
[最新有效]高翔RGB-D SLAM中最新版本g2o报错解决方案
报错一共有两个原因:初始化g2o的接口已经发生变动需要修改解决方案:以下是最新的初始化g2o的代码(2019年11月15日14:17:40)// 初始化g2o typedef g2o::BlockSolver< g2o::BlockSolverTraits<6,3> > Block; // pose维度为 6, landmark 维度为 3 std::un...原创 2019-11-15 14:18:56 · 486 阅读 · 0 评论 -
如何理解视觉SLAM视觉里程计VO:如何从图片中还原计算出相机的三维位姿算法教程Python代码实践
视觉里程计是什么?视觉里程计有什么用?需要我们求解什么?视觉里程计(Visual Odometry,VO) 算法是什么?视觉SLAM中的视觉里程计算法就是指的是通过某个算法根据前后两张图片求出当前时刻内相机位置和姿态相对上个时刻相机位置和姿态的变化的那种算法。这个就和出租车的里程计一样记录每个时刻的车轮速度及其滚动距离类似。只不过视觉里程计算法是求相机在各个时刻的位置姿态,所以才叫做视觉里程计算...原创 2019-11-08 19:36:37 · 1666 阅读 · 0 评论 -
如何通俗理解相机标定公式推导与Python编程实践教程
今日疯言疯语:学习一个算法重要的就是弄清楚这个算法要解决怎样的问题,它的已知量(输入)是什么,待求解的未知量(输出)是什么。如果这三个问题没找到答案,就去学算法细节只会浪费大量时间。——知乎@司南牧相机标定(Calibration)做了什么事?为何很多地方都需要相机标定?相机标定主要是为了通过对某个特殊形状的物体拍照从而找到照片中的像素点坐标与现实世界中的三维坐标之间的变换关系。这个变换关...原创 2019-11-03 15:33:01 · 573 阅读 · 0 评论 -
cv2 drawKeypoints 使用自定义数组来绘制关键点
def draw_features(img, features): """Draw features""" # Convert to OpenCV KeyPoints cv_kps = [] for f in features: cv_kps.append(cv2.KeyPoint(f.pt[0], f.pt[1], f.size)) # ...原创 2019-10-22 18:52:21 · 1704 阅读 · 1 评论 -
如何理解二值图连通域快速标记算法快速连通物体检测Fast-Connected-Component教程附带python代码实现
如何快速在一张二值化了的图片检测那些像素是属于一个物体块?注意快速连通物体检测算法只能识别二值化了的图片中哪些像素是相互连接的一个整体。换句话说就是这个算法可以检测到哪些像素是相互连通的。它其实就是可以看作是计算机算法中的连通子图问题。连通物体检测算法有哪些用?1. OCR文字识别中可以用连通物体检测算法识别哪些像素是属于一个汉字。然后对这个汉字识别 2. 物体检测。直接看下图就懂了我对...原创 2019-10-15 00:15:09 · 909 阅读 · 1 评论 -
如何理解图像处理中的Otsu's 二值化算法(大津算法)Python编程实践
Otsu’s 二值化(大津算法)二值化是什么?有什么用?PDF扫描成电子版,文字识别,车牌识别等等图像处理场合均需要使用“二值化”操作。我们知道图像是一个矩阵组成,矩阵的元素是一个数字,这个数字是当前像素点对应的颜色(即像素值)。而图片的二值化操作就是将所有像素值变成要么是0要么是1.一般二值化怎么做的呢?答:“设置一个数字d,只要像素值大于这个阈值d那就设置为1,小于这个阈值d那就设置为0。...原创 2019-10-12 21:28:18 · 2268 阅读 · 0 评论 -
史上最易懂的最小二乘法实践:线性最小二乘法推导与Python求解编程教程
最小二乘法有什么用?一般用它做什么事?我们最早接触最小二乘法是在高中的时候学的。最小二乘法一般被用来拟合数据。什么叫做拟合数据?就是给定你一堆数据,然后你假设这些数据是满足某种函数的,比如你假设这些数据是一条直线。现在问题来了到底这些数据所对应的那条直线斜率是多少截距是多少?这就得用最小二乘法来求解。总结:最小二乘法拟合数据的步骤有两步。1.首先,假设这些数据符合某种函数。而这种函数往往有几...原创 2019-09-26 19:16:59 · 1076 阅读 · 0 评论 -
2D二维旋转变换,坐标旋转变换矩阵是如何推导而来?三维旋转变换矩阵与二维旋转变换有什么联系?
我们在做几何变换的时候经常需要把某个坐标系上的所有点都进行一个旋转,这个操作就叫做坐标系旋转。下图是一个典型的二维坐标系旋转。我们把蓝色的坐标系旋转了θ\thetaθ度,新坐标系就是红色的坐标系。假设我们现在已知一个点相对红色那个坐标系的坐标,然后我们想求得该点相对于蓝色那个坐标系的坐标。这个其实很简单我们利用高中学的三角几何就可以轻松解决。上面那个坐标系旋转可以转换为下面这个线段旋转。旋转前...原创 2019-09-25 22:10:38 · 1507 阅读 · 1 评论 -
python cv2 opencv手写一个棋盘格
有时候我们需要用棋盘格测试我们写的代码或者用于校准相机。虽然opencv里面有自带的代码。但是了解下如何写一个棋盘格也是有必要的。下图是一个简单的实现。import cv2import numpy as npchecker_img = np.zeros((320,320))block_width = 320//8black_block = np.full((block_width,blo...原创 2019-09-24 20:14:26 · 1884 阅读 · 0 评论 -
适合初学者的SLAM实践教程(1):相机模型-如何从照片中重建出像素点的三维坐标?
三维重建到底是怎么回事?已知什么数据?待求解哪些变量?看下面这张图,一图解释如何根据照片进行三维重建。首先,三维重建就是根据把照片的像素点对应现实世界中某个点在相机坐标系下的三维坐标计算出来。一般我们可以通过深度相机或者双目视觉等方式获取目标物体离相机坐标系原点的距离ZrealZ_{real}Zreal,这里的相机坐标系的原点就是相机的焦点。所以现在我们已经知道了的数据有:“像素点A在照片坐...原创 2019-09-24 19:21:21 · 1096 阅读 · 0 评论 -
【易懂教程】我是如何快速理解卡尔曼滤波Kalman Filter(KF)算法的(1)?
牛逼的算法往往都是来源于一个很简单的思想所演化而来,如果你不了解这个思想和演化过程那就谈不上了解那个牛逼的算法——@Ai酱直观理解首先卡尔曼滤波要解决的问题是什么?我以机器人估计自己离障碍物距离为例答:首先机器人已知“上个时刻机器人离障碍物距离”,“传感器测量的机器人离障碍物的距离(我们称它为观测值,比如雷达直接测量机器人离障碍物距离7m)”和“自己当前时刻的速度”这三个数据。而根据“上...原创 2019-08-01 14:50:54 · 3214 阅读 · 7 评论 -
【易懂教程】我是如何十分钟理解与推导贝叶斯滤波(Bayes Filter)算法?
像卡尔曼滤波(Kalman filters)、粒子滤波(Particle filters),隐含马尔科夫模型(Hidden Markov models),动态贝叶斯网络(Dynamic Bayesian networks)等等算法。这些算法都和贝叶斯滤波算法非常相似.因此学好了贝叶斯滤波再学其他算法那就容易很多了。破解概念上的束缚之贝叶斯滤波算法到底有什么用?学东西最烦的是看了半个月的算法细节...原创 2019-07-30 20:00:46 · 20329 阅读 · 34 评论 -
易懂的Bresenham 布雷森汉姆算法画圆的原理与Python编程实现教程
Bresenham 布雷森汉姆算法画圆的原理与编程实现教程注意:Bresenham的圆算法只是中点画圆算法的优化版本。区别在于Bresenham的算法只使用整数算术,而中点画圆法仍需要浮点数。所以我先介绍中点画圆法。中点画圆法看下面这个图,这就是一个像素一个像素的画出来的。我们平常的圆也是一个像素一个像素的画出来的,你可以试试在“画图”这个软件里面画一个圆然后放大很多倍,你会发现就是一些像素...原创 2019-07-21 15:09:12 · 4011 阅读 · 3 评论 -
[易懂]FAST特征点BRIEF描述子(Binary Robust Independent Elementary Features)特征周围信息提取描述子原理及Python代码实现教程
二进制鲁棒独立的基本特征(BRIEF)BRIEF它二进制描述子。即是一段二进制串。BRIEF的作用是提取某个特征点周围像素信息。如果你不懂特征点是什么请参见FAST特征点提取与匹配算法教程Python实践。特征点提取算法只是知道了哪个像素点是特征点,但是我们提取特征点一般是用来目标跟踪三维重建之类的任务。而这些任务中有一个必备环节就是:找前后两帧图片哪两个特征点是同一个特征点。而为了找同一个特征...原创 2019-07-20 14:42:49 · 2083 阅读 · 1 评论 -
[易懂]FAST特征点提取与匹配算法教程Python实践
特征点提取与匹配在计算机视觉中是一个很重要的环节。比如人脸识别,目标跟踪,三维重建,等等都是先提取特征点然后匹配特征点最后执行后面的算法。因此学习特定点提取和匹配是计算机视觉中的基础。本文将介绍FAST特征点提取与匹配算法的原理,并使用Python不调用OpenCV包实现FAST特征点提取算法。特征点提取到底是提取的是什么?答:首先,提取的是角点,边缘。提取角点可以进行跟踪,提取边就可以...原创 2019-08-05 11:24:25 · 6055 阅读 · 1 评论 -
易懂的对极几何与三维重建概念理解与matlab编程实践
破解对极几何中的概念障碍首先介绍下三维重建到底要做什么事。我们知道一个物体在现实世界的位置是三维的,但是照片是二维的。这意味照片拍摄到的场景丢失了一维。而这一维就是物体离相机的远近。对极几何三维重建就是希望通过多张角度的照片还原各个像素点相对相机的三维坐标。看本文前你需要了解针孔相机成像原理(即小孔成像原理,参见教程《针孔相机模型成像原理与图像变形矫正教程》)下面这幅图就描述了对极几何。对...原创 2019-07-16 14:25:57 · 1658 阅读 · 3 评论 -
Ubuntu下cmake教程实践从入门到会用
如果你下载别人的开源代码,你会发现很多人的项目中有个CMakeLists.txt。其实这是因为他们用cmake这个软件来编译整个项目。为何要用cmake?如果不用cmake的话那么我们一般会用visual studio这种软件来编译运行整个项目。但是这里有个问题我visual studio2010的项目很可能vs2017打不开。这就很麻烦。于是人们开始想我能不能有个软件,我们写好各个模块的...原创 2019-06-13 09:58:01 · 1470 阅读 · 1 评论 -
Ubuntu下安装与使用Eigen矩阵运算库教程
安装Eigen库这个很简单就从Eigen的官方网站下载源代码,然后在另外一个文件夹下对源码进行编译安装即可。现在我假设你已经下载好了源码,解压后的源码文件目录大致长这样。你只需关注我所选中的那个CMakeLists.txt这个文件即可。我的源文件目录是eigen-eigen-323c...,现在你创建一个额外的文件夹(必须在eigen-eigen-323c...这个文件夹之外,因为我们是想...原创 2019-06-13 11:45:02 · 2058 阅读 · 0 评论 -
一文梳理Ubuntu下Eigen矩阵运算库总结教程
Eigen是一个高效率的c++矩阵运算库,tensorflow等一系列开源框架都是用它来进行高效率的代数运算。如果你还没安装Eigen,那么亲参考Ubuntu下如何安装与使用cmake编译Eigen。0. 入门如果你不清楚如何使用cmake请参考Ubuntu下cmake教程实践从入门到会用。如果你不清楚引入Eigen头文件时CMakeLists.txt需要写什么内容请参考Ubuntu下如何...原创 2019-06-13 15:06:43 · 860 阅读 · 1 评论 -
Ubuntu下使用Eigen旋转几何运算总结教程
如果你未安装Eigen或者完全未接触Eigen请参考下面这三篇好文一文梳理Ubuntu下Eigen矩阵运算库总结教程Ubuntu下安装与使用Eigen矩阵运算库教程Ubuntu下cmake教程实践从入门到会用#include<iostream>using namespace std;#include <Eigen/Core>// 几何模块(旋转矩阵,四元数...原创 2019-06-13 16:41:27 · 305 阅读 · 0 评论 -
一文梳理旋转矩阵,欧拉角,四元数,旋转向量和齐次变换矩阵之间的联系和用途
前言这几个名词都是用来描述一个物体的位置和姿态的。它们之间可以相互转化,而且各有各的优点与缺点。我先把这几个名词之间的联系理清楚,然后再解释他们各自适合的领域以及为何需要他们。旋转矩阵的初衷就是人们希望给定一个向量x,然后我对它旋转,能直接通过矩阵乘法的形式得到旋转后的向量坐标。也就是说y=Ax。这个方便计算机计算,因此旋转矩阵常用于编程。既然有了旋转矩阵那么为何还要欧拉角呢?这是因为我给你一个...原创 2019-06-14 09:18:36 · 3894 阅读 · 3 评论 -
李群与李代数它们之间的联系
李群是什么?李群就是一个矩阵的集合,为何有了矩阵还要弄个矩阵集合呢?因为矩阵它只是一个数,而像实际应用中我可能需要一系列数去描述某个事件的变化。而李群就是用来描述旋转平移上的变化,物体的旋转平移是连续的所以李群它也是随时间变化连续的。某个时刻下李群它是一个矩阵,但是一段时间内它是无数个矩阵的集合。旋转矩阵和齐次变换矩阵都是李群。旋转矩阵一般叫做特殊正交群简写为SO(3),Special ort...原创 2019-06-14 20:22:51 · 3046 阅读 · 0 评论 -
直接法(Direct Method)计算相机位置和姿态
1. 直接法的思想我们在<LK光流法跟踪特征点>这篇文章介绍了如何跟踪某个像素并形成轨迹。事实上跟踪这些特征点的最终目的还是为了计算相机的位置和姿态变化。今天我们要介绍的直接法就是不先计算像素的轨迹而是直接计算出相机的位置和姿态。直接法的思想是:“同一个块它的灰度值是不会发生变化的(这和光流法非常像)。比如说我们相机绕着一个球去拍摄。那么时刻t的这帧里面球所在的那块像素的灰度值,与它...原创 2019-06-19 21:52:32 · 2241 阅读 · 0 评论 -
针孔相机模型成像原理与图像变形矫正教程
相机成像原理与焦距概念针孔相机的本质就是初中学过的小孔成像,镜头是一个小孔,然后光线透过小孔被感光传感器所捕获。当然以前的相机是通过胶片来捕获光线。虽然各个时代的相机记录图像的技术不一样,但是不变的都是利用小孔成像这个原理来将外面的三维的大图像缩小到一个二维的小照片上。相信你不会对下面这个图陌生,比较初中物理书上必备这个。真实图像各个像素点的位置与照片里面的图像的位置对应关系是由下面这个红色...原创 2019-06-15 21:16:56 · 8848 阅读 · 0 评论 -
Kalman Filter(KF)卡尔曼滤波的理解与原理推导
背景介绍卡尔曼滤波使用来做什么的?卡尔曼滤波要解决的问题就是,根据测量数据和上一个时刻的状态来估计当前状态。打个比方就是,你闭着眼睛走路,那么你的状态就是你相对环境的位置。而你的测量数据就是你睁开眼一次看到的场景。而你看一眼可能看得不准确。你凭感觉估计也估计不准确。卡尔曼滤波要做的事就是结合你估计的自己当前相对环境的位置和你看一眼觉得自己相对与环境中的位置(测量数据),来更精确的估计出当前你相对...原创 2019-06-20 21:08:37 · 1762 阅读 · 1 评论 -
实例通俗解释高斯牛顿法求解曲线拟合的最小二乘法问题与c++编程实践教程
要解决的问题是:现在有N个数据点(x,y)。我们假设这个曲线y=exp(ax2+bx+c)+noisey=exp(ax^2+bx+c)+noisey=exp(ax2+bx+c)+noise可以拟合那堆数据,其中a,b,c是待求解的参数,noise是噪声。我们要根据那堆数据去算出a,b,c的值。用的方法是高斯牛顿法。为啥有个牛顿?因为它和牛顿法一样都是用泰勒展开,只不过高斯牛顿法是一阶泰勒展开。一...原创 2019-06-16 20:43:28 · 2395 阅读 · 6 评论 -
视觉SLAM中ORB特征点算法(关键点+描述子)
特征点是什么SLAM需要根据路标来计算当前相机的位置和姿态。而视觉SLAM的路标就是图像中的特征点了。注意:只要谈到图像中的特征点你就得记得它包含两个内容关键点和描述子。关键点指的特征点在图像中的位置,而描述子是指的是关键点的朝向和周围像素信息。相同特征点他们的描述子相似。现在已有很多特征点提取算法。其中既能兼顾性能又能兼顾精度的一种特征点提取算法那就是:ORB特征点。前面我们提到了只要提到特...原创 2019-06-17 16:15:04 · 4762 阅读 · 0 评论 -
对g2o图优化的理解与c++实践
g2og2o是General(Hyper)Graph Optimization [1] 的缩写,是一个C ++框架(g2o在github的代码,注意有Python库和.Net库的g2o)。它把优化问题变成一个图。节点是要优化的变量,边是误差。它将许多典型的顶点和边缘实现为可以直接调用和使用的类,例如VertexSE3Expmap在SE3空间中表示机器人姿势,VertexSBAPointXYZ以表...原创 2019-06-21 18:16:28 · 1080 阅读 · 0 评论 -
详细解释LK光流法(Lucas-Kanade)跟踪特征点附matlab不调库函数实现
LK光流法是什么在很多场景我们都需要对特征点进行跟踪,比如人脸,无人机目标跟踪,SLAM中特征点跟踪来计算相机的姿态等等。最粗暴的方式是每次都重新计算一次特征点,然后找到前后两张图片的相同特征点,那么就可以实现跟踪。这种方法的特点是准确,因此在很多场合都有应用,如果你感兴趣可以看看这篇文章视觉SLAM中ORB特征点算法(关键点+描述子)。但是这种方法计算复杂度太高,因为每次都得遍历整个图找关键点...原创 2019-06-18 16:56:43 · 6027 阅读 · 5 评论 -
高中生能看懂的详细通俗讲解卡尔曼滤波Kalman Filter原理及Python实现教程
接触过传感器数据的同学一定不可避免见到一个名字“卡尔曼滤波”。这是何方神圣?请看后面分晓。很多时候看不懂一个算法是因为里面很多概念上的问题你没了解,就直接看细节了当然看不懂。最关键的事就是你得先了解卡尔曼滤波到底有啥用,它的初衷是什么?接下来我就是想讲讲破解卡尔曼滤波的一些概念上的认知障碍这个事。破解概念上的认知枷锁:卡尔曼滤波做的事卡尔曼滤波做的事就是:举个例子,已知上个时刻飞机的位置,知道...原创 2019-07-09 17:05:31 · 35512 阅读 · 29 评论 -
使用对极约束进行重建的方法原理
求解下面这个方程注意,p1是像素坐标(已经把深度Z除了),而MP则是含有Z的齐次坐标。M是把P变换到相机坐标下的外参数矩阵。照片去除深度Z这维的方法就是[x/z,y/z,1]。所以越远的地方看起来就越密集(一个像素对应实际距离更大)...原创 2019-07-18 11:28:46 · 167 阅读 · 0 评论 -
[概览]自动驾驶与AR增强现实中的关键技术:SLAM
SLAM中文全称叫做:实时定位与建图技术(Simultaneous localization and mapping).SLAM技术就是通过利用传感器比如:摄像头或者雷达对周围环境进行录像,然后把环境通过三维重建建图出来。最终把这周围的地图记录下,那就可以精确导航了。SLAM的应用?从名字可以看到SLAM的作用:定位和建图。我们通常用的地图是用导航系统(如:北斗导航系统)来定位,这个虽然很方便...原创 2019-06-12 14:38:21 · 1732 阅读 · 0 评论