全方位图像(球体模型)检查极线约束

时间:2015-11-20 08:01:12

标签: computer-vision

我在基于RANSAC方案中全方位图像的球体模型验证基本矩阵时苦苦挣扎。 See here用于球体模型的可视化。

为了消除异常值,基本/基本矩阵在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;

我希望我的问题有点清楚。否则,我很乐意给出进一步的解释。

非常感谢, 纳斯

1 个答案:

答案 0 :(得分:0)

所以我找到了自己的问题/问题的答案。

可以在this paper中找到“运动结构”(SfM)以及球形图像的错误描述。

对极约束的角度误差 m 2 T E m 1 = 0 < / strong>定义为:

    eg = sin-1(m2TEm1)

其中:

  • e:极线错误
  • g:代表测地线

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

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