1.卡方分布
定义: 设
X
1
,
X
2
,
…
,
X
n
X_{1}, X_{2}, \ldots, X_{n}
X1,X2,…,Xn相互独立,且都服从标准正态分布N(0,1),则称随机变量
χ
2
=
X
1
2
+
X
2
2
+
⋯
+
X
n
2
\chi^{2}=X_{1}^{2}+X_{2}^{2}+\cdots+X_{n}^{2}
χ2=X12+X22+⋯+Xn2 服从自由度为n的
χ
2
\chi^{2}
χ2 分布,记为
χ
2
∼
χ
2
(
n
)
\chi^{2} \sim \chi^{2}(n)
χ2∼χ2(n), 其概率密度函数如下所示:
2. 概率分布表
χ
2
\chi^{2}
χ2的概率分布表列出了给定自由度时,
χ
2
\chi^{2}
χ2大于表中数值的概率;换句话说,给定自由度n,
χ
2
=
X
1
2
+
X
2
2
+
⋯
+
X
n
2
\chi^{2}=X_{1}^{2}+X_{2}^{2}+\cdots+X_{n}^{2}
χ2=X12+X22+⋯+Xn2有(1-p)的概率小于表中数值。
3.卡方检验在ORB-SLAM中的应用
ORB-SLAM在计算重投影误差时,利用 χ 2 \chi^{2} χ2的概率分布表进行卡方检验,其中具体过程如下:
单目:
-
定义单目重投影误差:
e x = u x − u ‾ x e y = u y − u ‾ y (1) \begin{aligned} &\mathbf{e}_{\mathbf{x}}=\mathbf{u}_{\mathbf{x}}-\overline{\mathbf{u}}_{x} \\ &\mathbf{e}_{\mathbf{y}}=\mathbf{u}_{\mathbf{y}}-\overline{\mathbf{u}}_{y} \end{aligned} \tag 1 ex=ux−uxey=uy−uy(1)
其中: u \mathbf{u} u为特征点的2D坐标; u ‾ \overline{\mathbf{u}} u为地图点投影到图像上的2D坐标; 下标x、y为相关变量在x、y方向的分量。 -
假设重投影误差 e x \mathbf{e}_{\mathbf{x}} ex、 e y \mathbf{e}_{\mathbf{y}} ey相互独立且服从均值为0的高斯分布:
e x 、 e y ∼ N ( 0 , σ ) (2) \mathbf{e}_x 、\mathbf{e}_y \sim \mathcal{N}(\mathbf{0}, \mathbf{\sigma}) \tag2 ex、ey∼N(0,σ)(2)
其中标准差 σ \mathbf{\sigma} σ由特征点所在的金字塔层级确认,具体来说,若第0层的标准差为p个像素(ORB-SLAM中设定为1),每层金字塔的缩放系数为s,则第m层的金字塔的特征点标准差为:
σ = s m ∗ p \mathbf{\sigma} = s^m*p σ=sm∗p -
则 e ‾ x \overline{\mathbf{e}}_{\mathbf{x}} ex、 e ‾ y \overline{\mathbf{e}}_{\mathbf{y}} ey满足标准正态分布
e ‾ x = ( e x − 0 ) / σ e ‾ y = ( e y − 0 ) / σ \begin{aligned} &\overline{\mathbf{e}}_{\mathbf{x}}=(\mathbf{e}_{\mathbf{x}}-0)/\mathbf{\sigma}\\ & \overline{\mathbf{e}}_{\mathbf{y}}=(\mathbf{e}_{\mathbf{y}}-0)/\mathbf{\sigma} \end{aligned} ex=(ex−0)/σey=(ey−0)/σ -
假设3D点和二维点正确关联,则其计算得到的 χ 2 = e ‾ x 2 + e ‾ y 2 \chi^{2} = \overline{\mathbf{e}}_{\mathbf{x}}^2+\overline{\mathbf{e}}_{\mathbf{y}}^2 χ2=ex2+ey2,应满足自由度为2的卡方分布;取p-value=0.05,对应的数值为5.99,即 χ 2 \chi^{2} χ2理论有95%的概率小于5.99;若 χ 2 \chi^{2} χ2<5.99我们认为假设成立,反之拒绝假设。
const float &sigmaSquare1 = mpCurrentKeyFrame->mvLevelSigma2[kp1.octave];//利用特征金字塔读取标准差
const float x1 = Rcw1.row(0).dot(x3Dt)+tcw1.at<float>(0);
const float y1 = Rcw1.row(1).dot(x3Dt)+tcw1.at<float>(1);
const float invz1 = 1.0/z1;
{
float u1 = fx1*x1*invz1+cx1;//3D点投影到二维平面的横坐标
float v1 = fy1*y1*invz1+cy1;//3D点投影到二维平面的纵坐标
float errX1 = u1 - kp1.pt.x; //未归一化的误差
float errY1 = v1 - kp1.pt.y;
// 基于卡方检验计算出的阈值(假设测量有一个像素的偏差)自由度2
if((errX1*errX1+errY1*errY1)>5.991*sigmaSquare1)
continue;
}
双目:
双目的检验过程和单目类似,3D点在双目图像上应有4个投影分量,但由于双目存在极线约束,限制了一个自由度,所以最后其实是满足自由度为3的卡方检验。具体如下:
const float &sigmaSquare1 = mpCurrentKeyFrame->mvLevelSigma2[kp1.octave];//利用特征金字塔读取标准差
const float x1 = Rcw1.row(0).dot(x3Dt)+tcw1.at<float>(0);
const float y1 = Rcw1.row(1).dot(x3Dt)+tcw1.at<float>(1);
const float invz1 = 1.0/z1;
{
float u1 = fx1*x1*invz1+cx1;
float u1_r = u1 - mpCurrentKeyFrame->mbf*invz1; // 根据视差公式计算假想的右目坐标
float v1 = fy1*y1*invz1+cy1;
float errX1 = u1 - kp1.pt.x;
float errY1 = v1 - kp1.pt.y;
float errX1_r = u1_r - kp1_ur;
// 自由度为3
if((errX1*errX1+errY1*errY1+errX1_r*errX1_r)>7.8*sigmaSquare1)
continue;
}