使用openCV的极线几何/立体视觉

Woo*_*oni 5 c++ opencv

我正在使用openCV开发极线几何.(最终目标是使用同一相机从不同视点拍摄的两幅图像估算模型的世界坐标或深度信息)

然而,我正在努力估计用于极线几何的基本矩阵和基本矩阵.

具有不同摄像机视点的对应点

如上所示,我捕获了两个具有不同视点的图像(相同的相机).相同的颜色点是对应点.

确切的坐标是(如果你想验证,我写它)

points1:左

points1.push_back(Point2f(157,223));
points1.push_back(Point2f(190,312));
points1.push_back(Point2f(157,541));
points1.push_back(Point2f(136,443));
points1.push_back(Point2f(355,374));
points1.push_back(Point2f(346,406));
points1.push_back(Point2f(252,410));
points1.push_back(Point2f(254,379));
Run Code Online (Sandbox Code Playgroud)

第2点:对

points2.push_back(Point2f(190,188)); 
points2.push_back(Point2f(303,284)); 
points2.push_back(Point2f(252,512)); 
points2.push_back(Point2f(166,420)); 
points2.push_back(Point2f(422,311));
points2.push_back(Point2f(412,339));
points2.push_back(Point2f(341,366));
points2.push_back(Point2f(345,335));
Run Code Online (Sandbox Code Playgroud)

使用积分,

Mat FundamentalMatrix = findFundamentalMat(points1,points2,FM_RANSAC,1.0,0.99);

openCV函数用于计算基本矩阵.但是,我猜计算的基础很奇怪.

计算基本矩阵和约束

  • left:使用FM_RANSAC,右:使用CV_FM_8POINTS

计算的基本矩阵应满足x'T F x = 0

其中x'是(u2,v2,1)^ T,x是(u1,v1,1)^ T

与u1,v1 =点1坐标和u2,v2 =点2坐标.

如上所述,我计算了x'T F x = 0.然而第三种情况(第三对应点),它不是零.

当然我尝试了不同的方法.

Mat FundamentalMatrix = findFundamentalMat(points1, points2, CV_FM_8POINT);
Run Code Online (Sandbox Code Playgroud)

也试过了.

但是对于这种情况,所有相应的点都不满足约束.

有什么问题?我做错了吗?(我在想的是8分仍然不足,应该有更多积分)

此外,我估计了不同观点的模型(外在矩阵)的姿态.并执行相机校准.因此估计E1(视点1的外在矩阵),E2,K(内在矩阵).(我猜这几乎是准确的.因为如果我使用E1,E2和k投影模型点,那么它将被投影到图像上的正确点). - >然后我估计必要矩阵E = K ^ TFK.E应该满足E应该为0的行列式并且具有特征值(1,1,0)或(sigma,sigma,1)但是它不是.

有什么问题?