SLAM中的卡方分布
视觉slam中相邻帧特征点匹配时,动辄上千个特征点,匹配错误的是难免的,而误匹配势必会对位姿精度以及建图精度造成影响,那么如何分辨哪些是误匹配的点对儿呢?如果已知两帧的的单应矩阵,假设单应矩阵是没有误差的,那么两帧中匹配正确的特征点通过单应矩阵是重投影是不应该有误差的或者误差十分小,而误匹配的特征点的重投影误差一定十分显著。那么我们是不是可以设置一个误差门限,从而甄别出这些误匹配点?可是这个误差门限该设置为多少?
假设图像金字塔第n层中一个特征点\(\mathbf{p_c}=\begin{bmatrix}u \\ v\end{bmatrix}\)以及其对应的世界坐标系位置\(\mathbf{p_w}=\begin{bmatrix}x \\ y \\ z\end{bmatrix}\)和转换矩阵\(T_{cw}\),将空间点重投影到图像中为\(\mathbf{p_c'}=\begin{bmatrix}u' \\ v'\end{bmatrix}\)。那么x轴的重投影误差\(e_x=u-u'\),假设变换矩阵没有误差,实际中由于不同时刻拍摄以及成像原因,会给重投影误差带来噪声,不妨假设\(e_x\sim N(0,\sigma_x^2)\),同理假设\(e_y\sim N(0,\sigma_y^2)\),并假设噪声方差\(\sigma_x^2=\sigma_y^2=(s^n\times n\_pixels)^2\),\(n\_pixels\)为噪声所带来的的像素误差数,这里取值1,s为图像金字塔的缩放因子,通常取1.2,有\(\sigma_x^2=\sigma_y^2=(s^n)^2\)显然方差与特征点所处的层数有关。这里面表达了特征点所处的金字塔层数越高,重投影误差的方差就越大。因此有\(\frac {1}{s^n}e_x\sim N(0,1),\frac {1}{s^n}e_y\sim N(0,1)\)。
卡方分布
若k个随机变量\(Z_1,Z_2,...,Z_k\)是相互独立,符合标准正态分布的随机变量(数学期望为0、方差为1),则随机变量Z的平方和\(X=\sum_{i-1}^{k}Z_i^2\)被称为服从自由度为 k 的卡方分布,记作\(X\sim\chi^2(k)\)。
令\(Z_1=\frac {1}{s^n}e_x,Z_2=\frac {1}{s^n}e_y,X=Z_1^2+Z_2^2\),根据卡方分布的定义,\(X\sim\chi^2(2)\),即2自由度的卡方分布。对于双目匹配到的特征点在右图中的x坐标为\(u_r'\),重投影后计算得到特征点左图的x坐标\(u_l\),根据\(视差d=\frac {基线b*f_x}{深度}\),可以计算出视差从而得到重投影后右图中特征点x坐标\(u_r=u_l-d\),得\(e_r=u_r'-u_r\)。同理\(\frac {1}{s^n}e_r\sim N(0,1)\),可构成卡方分布的另一个自由度,而\(X\)的物理意义就是各项误差的平方和。
下图为不同自由度卡方分布的概率密度函数和累积分布函数,分布函数记为\(F(X\leqslant x)=\alpha\),\(\alpha\)就是一个概率值,表示如果\(X\)服从卡方分布,那么\(X\)就有\(\alpha\)的概率值在\([0,x]\)中。如果已知\(\alpha\)的值,通过查表的方法我们可以找到对应的\(x\)值。比如2自由度的卡方分布,\(X\in [0,5.99]\)时,我们有95%的把握认为\(X\)是服从该分布的,以此将\(X>5.99\)的时候将该特征点排除。


下图为卡方阈值与对应P值的查找表,可以简单的认为\(P值=1-\alpha\)。具体解释可以参考如何理解假设检验、P值?。

实际代码
// openvslam/module/two_view_triangulator.cc:95
// chi-squared values for p=5%
// (n=2)
constexpr float chi_sq_2D = 5.99146;
// (n=3)
constexpr float chi_sq_3D = 7.81473;
Vec2_t reproj_in_cur;
float x_right_in_cur;
camera->reproject_to_image(rot_cw, trans_cw, pos_w, reproj_in_cur, x_right_in_cur);
if (is_stereo) {
const Vec2_t reproj_err = reproj_in_cur - keypt;
const auto reproj_err_x_right = x_right_in_cur - x_right;
if ((chi_sq_3D * sigma_sq) < (reproj_err.squaredNorm() + reproj_err_x_right * reproj_err_x_right)) {
return false;
}
}
else {
const Vec2_t reproj_err = reproj_in_cur - keypt;
if ((chi_sq_2D * sigma_sq) < reproj_err.squaredNorm()) {
return false;
}
}
上面的代码reproject_to_image就是将3D点重投影回图像中,reproj_err就是上文中的\(\begin{bmatrix}e_x \\ e_y\end{bmatrix},sigma\_sq=(s^n)^2\),reproj_err.squaredNorm()/sigma_sq就是\((\frac {1}{s^n})^2(e_x^2+e_y^2)=Z_1^2+Z_2^2=X\sim\chi^2(k)\)。
参考
SLAM中的卡方分布的更多相关文章
- SLAM中的EKF,UKF,PF原理简介
这是我在知乎上问题写的答案,修改了一下排版,转到博客里. 原问题: 能否简单并且易懂地介绍一下多个基于滤波方法的SLAM算法原理? 目前SLAM后端都开始用优化的方法来做,题主想要了解一下之前基于 ...
- 视觉SLAM中的数学基础 第四篇 李群与李代数(2)
前言 理解李群与李代数,是理解许多SLAM中关键问题的基础.本讲我们继续介绍李群李代数的相关知识,重点放在李群李代数的微积分上,这对解决姿态估计问题具有重要意义. 回顾 为了描述三维空间里的运动,我们 ...
- SLAM中的优化理论(一)—— 线性最小二乘
最近想写一篇系列博客比较系统的解释一下 SLAM 中运用到的优化理论相关内容,包括线性最小二乘.非线性最小二乘.最小二乘工具的使用.最大似然与最小二 乘的关系以及矩阵的稀疏性等内容.一方面是督促自己对 ...
- SLAM中的优化理论(二)- 非线性最小二乘
本篇博客为系列博客第二篇,主要介绍非线性最小二乘相关内容,线性最小二乘介绍请参见SLAM中的优化理论(一)-- 线性最小二乘.本篇博客期望通过下降法和信任区域法引出高斯牛顿和LM两种常用的非线性优化方 ...
- 视觉SLAM中相机详解
视觉SLAM中,通常是指使用相机来解决定位和建图问题. SLAM中使用的相机往往更加简单,不携带昂贵的镜头,以一定的速率拍摄周围的环境,形成一个连续的视频流. 相机分类: 单目相机:只是用一个摄像头进 ...
- SLAM中的变换(旋转与位移)表示方法
1.旋转矩阵 注:旋转矩阵标题下涉及到的SLAM均不包含位移. 根据同一点P在不同坐标系下e(e1,e2,e3)e'(e1',e2',e3')的坐标a(a1,a2,a3)a'(a1',a2',a3') ...
- 视觉SLAM中的数学基础 第二篇 四元数
视觉SLAM中的数学基础 第二篇 四元数 什么是四元数 相比欧拉角,四元数(Quaternion)则是一种紧凑.易于迭代.又不会出现奇异值的表示方法.它在程序中广为使用,例如ROS和几个著名的SLAM ...
- 视觉SLAM中的数学基础 第三篇 李群与李代数
视觉SLAM中的数学基础 第三篇 李群与李代数 前言 在SLAM中,除了表达3D旋转与位移之外,我们还要对它们进行估计,因为SLAM整个过程就是在不断地估计机器人的位姿与地图.为了做这件事,需要对变换 ...
- 第六篇 视觉slam中的优化问题梳理及雅克比推导
优化问题定义以及求解 通用定义 解决问题的开始一定是定义清楚问题.这里引用g2o的定义. \[ \begin{aligned} \mathbf{F}(\mathbf{x})&=\sum_{k\ ...
随机推荐
- 十天快速入门Python
课程导学 001 课程定位和目标 002 课程导学 第一部分 Python快速入门 第1天 Python基本语法元素 003 Python基本语法元素 004 程序设计基本方法 005 Python开 ...
- WebService学习二
了解了webservice的基础知识之后,我们来编写一个服务端和客户端,进行测试. 服务端 先写一个接口: @WebService public interface WebServiceI { //使 ...
- 零基础一年拿下BAT三家offer
背景 1.本人本科一本双非垫底的那种,硕士211.本硕电子通信,完全0基础,转行一年. 2.研一上第一学期上课+外派到老师合作公司写MATLAB.去年4月开始学习Java. 起步 1.实话说,刚决定转 ...
- 玩转 SpringBoot 2 快速整合 | Thymeleaf 篇
前言 Thymeleaf是一个适用于Web和独立环境的现代服务器端Java模板引擎. Thymeleaf的主要目标是为您的开发工作流程带来优雅的自然模板 - 可以在浏览器中正确显示的HTML,也可以用 ...
- .net core Cookie的使用
缘起: 公司领导让我做一个测试的demo,功能大概是这样的:用户通过微信扫一扫登陆网站,如果用户登录过则直接进入主界面,否则就保留在登录界面. 实现方法: 首先先把网站地址生成个二维码,在扫描二维码后 ...
- android 多行 RadioButton的使用
最近项目用到了多行RadioButton,随记录下. 先给出RadioButton的布局 <com.kuibu.jucai.widget.MyRadioGroup android:id=&quo ...
- 3.1、双向循环链表(java实现)
1.创建节点类 public class CNode<T> { public CNode prev; public CNode next; public T data; public CN ...
- Python3 爬虫之 Scrapy 核心功能实现(二)
博客地址:http://www.moonxy.com 基于 Python 3.6.2 的 Scrapy 爬虫框架使用,Scrapy 的搭建过程请参照本人的另一篇博客:Python3 爬虫之 Scrap ...
- 实现非管理型UPS在linux主机上的停电自动关机
买了个山特的SANTAK TG-BOX 850 UPS,自带USB通讯线缆.本以为官方软件提供Linux下的CLI命令以监控UPS状态. 官网提供的下载链接巨慢无比不说,CLI下只提供了安装脚本,没有 ...
- selenium-01-2环境搭建
首先下载好Eclipse 和配置好Java 环境变量 步骤省略, 请百度 方法一 添加jar包 官方下载地址: http://www.seleniumhq.org/download/ 官方地址 ...