视觉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. 时钟AnalogClock和DigitalClock

    <AnalogClock android:layout_width="fill_parent" android:layout_height="fill_parent ...

  2. VG有空间,创建逻辑卷

    1.查看VG空间 [root@CNSZ22PL2787 ~]# vgs VG #PV #LV #SN Attr VSize VFree VolGroup00 1 7 0 wz--n- 1.63t 1. ...

  3. python根据搜索词下载百度图片

    # coding=utf-8 """根据搜索词下载百度图片""" import re import urllib import os def ...

  4. 使用python合并excel

    当工作碰到需要将几个excel合并时,比如一个表,收集每个人的个人信息,陆续收回来就是十几张甚至几十张表,少了还好解决,但是很多的话就不能一个一个去复制了,这时候就想到了python,Python大法 ...

  5. QCustomplot使用分享(八) 绘制图表-加载cvs文件

    目录 一.概述 二.效果图 三.源码讲解 1.源码结构 2.头文件 3.移动游标 4.设置坐标轴矩形个数 5.添加图表数据 6.设置折线图类型 6.其他函数 四.测试方式 1.测试工程 2.测试文件 ...

  6. 07 (OC)* XIB原理和Xib、storyBoard、代码的优缺点

    1:可读性 2:可视化界面.立马看到 3:开发速度. 4:复用性 5:维护性差 本质 编译时对xml文件做了如下操作1,读取xml文件,生成所有界面对象,生成所有object(即自定义的control ...

  7. [VB.NET Tips]Try...Catch...End Try的另一种用法

    有时在调用一个方法时,会进行异常处理.但是当方法内部出现错误时,无法快速定位到是哪一行代码有问题. 下面介绍一下Try的另一个用法: Try...Catch ex As Exception When ...

  8. C# 反射基础用法

    1.引用命名空间 using System.Reflection; 2.object[] parameters = { 参数 }; 调用方法的参数数组 3.Type t = Type.GetType( ...

  9. unity - TileMap的注意事项

    本文记述了一些在使用Tilemap绘制场景时的需要注意的细节问题. 关于Tilemap的创建及使用本文不做说明,但推荐佳作:Unity中使用Tilemap快速创建2D游戏世界 - feng 本文项目地 ...

  10. AJAX基础内容

    1.什么是ajax?为什么要使用ajax? ajax是Asynchronous JavaScript and XML ,也称为创建交互式网页应用开发技术. 2.为什么采用ajax 1)通过异步交互,提 ...