卡方分布与卡方检验

目录

      • 1.卡方分布
      • 2. 概率分布表
      • 3.卡方检验在ORB-SLAM中的应用

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)的概率小于表中数值。
卡方分布与卡方检验_第1张图片

3.卡方检验在ORB-SLAM中的应用

ORB-SLAM在计算重投影误差时,利用 χ 2 \chi^{2} χ2的概率分布表进行卡方检验,其中具体过程如下:

单目:

  1. 定义单目重投影误差:
    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=uxuxey=uyuy(1)
    其中: u \mathbf{u} u为特征点的2D坐标; u ‾ \overline{\mathbf{u}} u为地图点投影到图像上的2D坐标; 下标x、y为相关变量在x、y方向的分量。

  2. 假设重投影误差 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 exeyN(0,σ)(2)
    其中标准差 σ \mathbf{\sigma} σ由特征点所在的金字塔层级确认,具体来说,若第0层的标准差为p个像素(ORB-SLAM中设定为1),每层金字塔的缩放系数为s,则第m层的金字塔的特征点标准差为:
    σ = s m ∗ p \mathbf{\sigma} = s^m*p σ=smp

  3. 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=(ex0)/σey=(ey0)/σ

  4. 假设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;
}

你可能感兴趣的:(#,数学基础,机器学习,python,算法)