视觉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)\)。

参考

  1. [ORB-SLAM2]卡方分布(Chi-squared)外点(outlier)剔除
  2. https://en.wikipedia.org/wiki/Chi-squared_distribution

SLAM中的卡方分布的更多相关文章

  1. SLAM中的EKF,UKF,PF原理简介

    这是我在知乎上问题写的答案,修改了一下排版,转到博客里.   原问题: 能否简单并且易懂地介绍一下多个基于滤波方法的SLAM算法原理? 目前SLAM后端都开始用优化的方法来做,题主想要了解一下之前基于 ...

  2. 视觉SLAM中的数学基础 第四篇 李群与李代数(2)

    前言 理解李群与李代数,是理解许多SLAM中关键问题的基础.本讲我们继续介绍李群李代数的相关知识,重点放在李群李代数的微积分上,这对解决姿态估计问题具有重要意义. 回顾 为了描述三维空间里的运动,我们 ...

  3. SLAM中的优化理论(一)—— 线性最小二乘

    最近想写一篇系列博客比较系统的解释一下 SLAM 中运用到的优化理论相关内容,包括线性最小二乘.非线性最小二乘.最小二乘工具的使用.最大似然与最小二 乘的关系以及矩阵的稀疏性等内容.一方面是督促自己对 ...

  4. SLAM中的优化理论(二)- 非线性最小二乘

    本篇博客为系列博客第二篇,主要介绍非线性最小二乘相关内容,线性最小二乘介绍请参见SLAM中的优化理论(一)-- 线性最小二乘.本篇博客期望通过下降法和信任区域法引出高斯牛顿和LM两种常用的非线性优化方 ...

  5. 视觉SLAM中相机详解

    视觉SLAM中,通常是指使用相机来解决定位和建图问题. SLAM中使用的相机往往更加简单,不携带昂贵的镜头,以一定的速率拍摄周围的环境,形成一个连续的视频流. 相机分类: 单目相机:只是用一个摄像头进 ...

  6. SLAM中的变换(旋转与位移)表示方法

    1.旋转矩阵 注:旋转矩阵标题下涉及到的SLAM均不包含位移. 根据同一点P在不同坐标系下e(e1,e2,e3)e'(e1',e2',e3')的坐标a(a1,a2,a3)a'(a1',a2',a3') ...

  7. 视觉SLAM中的数学基础 第二篇 四元数

    视觉SLAM中的数学基础 第二篇 四元数 什么是四元数 相比欧拉角,四元数(Quaternion)则是一种紧凑.易于迭代.又不会出现奇异值的表示方法.它在程序中广为使用,例如ROS和几个著名的SLAM ...

  8. 视觉SLAM中的数学基础 第三篇 李群与李代数

    视觉SLAM中的数学基础 第三篇 李群与李代数 前言 在SLAM中,除了表达3D旋转与位移之外,我们还要对它们进行估计,因为SLAM整个过程就是在不断地估计机器人的位姿与地图.为了做这件事,需要对变换 ...

  9. 第六篇 视觉slam中的优化问题梳理及雅克比推导

    优化问题定义以及求解 通用定义 解决问题的开始一定是定义清楚问题.这里引用g2o的定义. \[ \begin{aligned} \mathbf{F}(\mathbf{x})&=\sum_{k\ ...

随机推荐

  1. centos安装流量监控软件,并指定端口号监控

    yum install -y iptraf 安装好以后使用进入界面: iptraf-ng enter回车,比如22端口,就是22 22 然后退出 重新登录 ok!

  2. glusterfs详解及kubernetes 搭建heketi-glusterfs

    本文包含: gluster各存储卷详解.创建及使用 gluster-kubernetes搭建glusterfs存储 前言 传统的运维中,往往需要管理员手动先在存储集群分配空间,然后才能挂载到应用中去. ...

  3. java8 把List<Object> 根据某字段去重

      import java.util.ArrayList;import java.util.List;import org.apache.shiro.SecurityUtils;import org. ...

  4. 微信小程序商城构建全栈应用 Thinkphp5

    课程——微信小程序商城构建全栈应用[目录]第1章 前言:不同的时代,不同的Web第2章 环境,工具与准备工作第3章 模块,路由与获取请求参数第4章 构建验证层第5章 REST与RESTFul第6章 A ...

  5. 关于mock

    关于mock 一.什么是mock? 通俗来讲,在开发和测试过程中,由于环境不稳定或者协同开发的同事未完成等情况下,有些数据不容易构造或者不容易获取,就创建一个虚拟的对象或者数据样本,用来辅助开发或者测 ...

  6. vue-cli+webpack打包,上线

    1.先修改配置文件再打包.有些人打包后运行一片空白,主要是由于路径问题 所以首先需要修改config下的index.js配置文件 上图中第一个要修改的就是静态文件的路径,打包后静态文件就在当前目录下, ...

  7. [原创] 为Visio添加公式编辑器工具栏按钮

    前言 作为理工科的学生,在写论文时,难免会在示意图中添加一些公式来说明研究内容.常用的画图工具就是 Visio .而常用的公式编辑器就是 Mathtype .对于 Word 这种软件,Mathtype ...

  8. 引用、浅拷贝及深拷贝 到 Map、Set(含对象assign、freeze方法、WeakMap、WeakSet及数组map、reduce等等方法)

    从引用聊到深浅拷贝,从深拷贝过渡到ES6新数据结构Map及Set,再到另一个map即Array.map()和与其类似的Array.flatMap(),中间会有其他相关话题,例如Object.freez ...

  9. [LeetCode]Jump GameII

    题目:Jump GameII 如果要求找最小的调数,考虑扩张的思路. 思路如下: 1.首先找起始位能到达的范围是否覆盖了最终位置,并记录下搜索中的最远能到达的位置值,即max{nums[i] + i} ...

  10. loadrunner12录制手机app

    今天第一次使用LR12录制app,遇到了录制不上的问题,最终解决了,记录一下 我安装的版本是12.02社区版   HP_LoadRunner_12.02_Community_Edition_T7177 ...