视觉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. Python 为了提升性能,竟运用了共享经济

    大家或许知道,Python 为了提高内存的利用效率,采用了一套共用对象内存的分配策略. 例如,对于那些数值较小的数字对象([-5, 256]).布尔值对象.None 对象.较短的字符串对象(通常 是 ...

  2. 使用php安装pcntl模块

    想添加个php多进程任务,突然发现服务器上php不支持pcntl扩展,再看了下也没有phpize这个模块 首先看下当前php版本 [root@htest ~]# php -v PHP 5.3.3 (c ...

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

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

  4. Hbase与传统关系型数据库对比

    在说HBase之前,我想再唠叨几句.做互联网应用的哥们儿应该都清楚,互联网应用这东西,你没办法预测你的系统什么时候会被多少人访问,你面临的用户到底有多少,说不定今天你的用户还少,明天系统用户就变多了, ...

  5. MapReduce原理及操作

    注意:本实验是对前述实验的延续,如果直接点开始实验进入则需要按先前学习的方法启动hadoop 部署节点操作系统为CentOS,防火墙和SElinux禁用,创建了一个shiyanlou用户并在系统根目录 ...

  6. MapReduce应用案例

    1 环境说明 注意:本实验是对前述实验的延续,如果直接点开始实验进入则需要按先前学习的方法启动hadoop 部署节点操作系统为CentOS,防火墙和SElinux禁用,创建了一个shiyanlou用户 ...

  7. PLC与上位机的socket通讯——上位机C#程序(二)

    C#的网口通信 一.命令行 客户端程序:using System;using System.Collections.Generic;using System.Linq;using System.Tex ...

  8. EasySwoole+ElasticSearch打造 高性能 小视频服务系统

    EasySwoole+ElasticSearch打造高性能小视频服务 第1章 课程概述 第2章 EasySwoole框架快速上手 第3章 性能测试 第4章 玩转高性能消息队列服务 第5章 小视频服务平 ...

  9. js-数据交互--AJAX

    一:介绍 今天跟下大家简单的介绍一下,在前端开发中,前后端数据交互的一种手段,我们都知道,在前端往后端传送数据的话,利用get,post方法即可向后端发送数据,后端将数据接受,链接到数据库,进行数据库 ...

  10. 02 (H5*) Vue第二天

    目录: 1:全局过滤器的使用 2:局部过滤器 3:自定义键盘码 4:自定义指令 5:自定义私有指令 6:Vue生命周期. 7:网络请求 1:全局过滤器的使用 Vue.filter("msgF ...