【发布时间】:2015-11-20 08:01:12
【问题描述】:
我正在努力验证基于 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;
我希望我的问题能以某种方式明确。否则我很乐意提供任何进一步的解释。
非常感谢, 乔纳斯
【问题讨论】:
标签: computer-vision