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||)
我正在努力验证基于 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||)