Omnidirectional Image(球体模型)检查对极约束

Omnidirectional Image (sphere model) check epipolar constraint

我正在努力验证基于 RANSAC 方案中全向图像球体模型的基本矩阵。 See here 用于球体模型的可视化。

为了消除异常值,essential/fundamental 矩阵在 RANSAC 方案中计算,每次迭代仅 8 个点。要找到最正确的基本矩阵并拒绝异常值,必须检查对极约束。

原始代码检查针孔情况下基本矩阵的极线约束,其中像素的 w 分量为 1。

因为我必须使用球体模型,所以我不计算基本矩阵,而是直接使用从凸轮到单位球体的投影图像点计算基本矩阵。这部分正在工作。 但是,当我尝试根据球体的单位向量检查基本矩阵的极线约束时,解决方案是错误的。 在球体的情况下,w 分量不是 1,我认为检查有问题,但我没有找到任何解决方案。

有人可以帮助我如何调整球体情况下对极约束的验证吗?

在这里你可以找到原始代码,我将向量用于单位球体:

for(int i=0; i<N; i++)
{
    bool bIn = true;

    const cv::KeyPoint &kp1 = mvKeys1[mvMatches12[i].first];
    const cv::KeyPoint &kp2 = mvKeys2[mvMatches12[i].second];

    // original part in the pinhole case
    const float u1 = kp1.pt.x;
    const float v1 = kp1.pt.y;
    const float w1 = 1.0;
    const float u2 = kp2.pt.x;
    const float v2 = kp2.pt.y;
    const float w2 = 1.0;


    // NEW: using the sphere model -> points not anymore on image plane
    cv::Mat X1, X2;

    cam2sphere(kp1.pt.x, kp1.pt.y, X1);
    cam2sphere(kp2.pt.x, kp2.pt.y, X2);

    const float u1 = X1.at<float>(0);
    const float v1 = X1.at<float>(1);
    const float w1 = X1.at<float>(2);
    const float u2 = X2.at<float>(0);
    const float v2 = X2.at<float>(1);
    const float w2 = X2.at<float>(2);



    // Reprojection error in second image
    // l2=F21x1=(a2,b2,c2)

    const float a2 = f11*u1+f12*v1+f13*w1;
    const float b2 = f21*u1+f22*v1+f23*w1;
    const float c2 = f31*u1+f32*v1+f33*w1;

    const float num2 = a2*u2+b2*v2+c2*w2;

    const float squareDist1 = num2*num2/(a2*a2+b2*b2); // ???

    const float chiSquare1 = squareDist1*invSigmaSquare;

    if(chiSquare1>th)
        bIn = false;
    else
        score += thScore - chiSquare1;

    // Reprojection error in first image
    // l1 =x2tF21=(a1,b1,c1)

    const float a1 = f11*u2+f21*v2+f31*w2;
    const float b1 = f12*u2+f22*v2+f32*w2;
    const float c1 = f13*u2+f23*v2+f33*w2;

    const float num1 = a1*u1+b1*v1+c1*w1;

    const float squareDist2 = num1*num1/(a1*a1+b1*b1);

    const float chiSquare2 = squareDist2*invSigmaSquare;


    if(chiSquare2>th)
        bIn = false;
    else
        score += thScore - chiSquare2;

    if(bIn)
        vbMatchesInliers[i]=true;
    else
        vbMatchesInliers[i]=false;
}

return score;

我希望我的问题已经清楚了。否则我很乐意给出任何进一步的解释。

非常感谢, 乔纳斯

所以我找到了自己的答案question/problem。

可以在 this paper.

中找到具有球形图像错误描述的运动结构 (SfM) 的公式

对极约束的angular误差m2TE m1=0定义为:

    eg = sin-1(m2TEm1)

其中:

  • e: 对极误差
  • g:代表测地线

计算效率的最佳近似值是投影距离误差:

    ep = |m2TEm1|/(||m2||*||Em1||)