FindFundamentalMatrix找不到基本矩阵

时间:2011-07-26 15:58:42

标签: image-processing opencv computer-vision

我正试图通过使用来恢复相机的移动 基本矩阵,以及Wikipedia给出的算法。对于 我需要找到基本矩阵。我在用 OpenCV::findFundamentalMat为此。

两种意外行为:

  1. 使用不同的拟合算法会产生不同的结果, 特别是FM_8POINT是不同的。
  2. 给定一组点对(y,x),不满足yFx = 0 总是大于0。
  3. 我在这里不明白吗?我的例子是假的,或者是什么 继续?任何人都可以建议一个更好的测试例子吗?

    以下是一个最小的例子。创建12个人工点,每个点移位 那些点向右10个像素,从中找到基本矩阵 这两组点并为每个点打印yFx

    示例:

    int main(int argc, const char* argv[])
    {
       // Create two sets of points. Points in pts2 are moved 10pixel to the right of the points in pts1.
       std::vector<cv::Point2f> pts1, pts2;
       for(double y = 0; y < 460; y+=150)
       {
               for(double x= 0; x < 320; x += 150)
               {
                       pts1.push_back(cv::Point2f(x, y));
                       pts2.push_back(cv::Point2f(x+10.0, y));
               }
       }
    
       cv::Mat F = cv::findFundamentalMat(pts1, pts2);
    
       for(int i = 0; i < pts1.size(); i++)
       {
               // Creating p1, p2, the two points. Please let me know if this can be done in fewer lines.
               cv::Mat p1(3,1, CV_64FC1), p2(3,1, CV_64FC1);
    
               p1.at<double>(0) = pts1.at(i).x;
               p1.at<double>(1) = pts1.at(i).y;
               p1.at<double>(2) = 1.0;
    
               p2.at<double>(0) = pts2.at(i).x;
               p2.at<double>(1) = pts2.at(i).y;
               p2.at<double>(2) = 1.0;
    
               // Print yFx for each pair of points. This should be 0 for all.
               cout << p1.t() * F * p2 << endl;
       }
    }
    

    FM_RANSAC我得

    [1.999], [2], [2], [1.599], [1.599], [1.599], [1.198], [1.198], [1.198], [0.798], [0.798], [0.798]
    

    对于FM_8POINT,基本矩阵为zeros(3,3),因此yFx为0 适用于所有yx

    我只找到了T and R estimation from essential matrix,但这没什么用。

    修改yFx轮次错误(p1 / p2在cout-line中切换)。这个例子也不起作用,因为所有点都在一个平面上。

2 个答案:

答案 0 :(得分:3)

我相信基本矩阵解决了等式p2.t() * F * p1 = 0,即你的代码中p1和p2相反。至于为什么8点算法返回零矩阵,我不知道,抱歉。

编辑:好的,我相信我记得为什么8点算法在这里产生了不好的结果。你在两组点之间的运动是纯粹的平移而没有旋转,即它只有三个自由度。基本矩阵有7个自由度,因此无法估计;这被称为退化案例。有关基本/基本矩阵估计中的退化情况的进一步描述,请参见this paper

也可能是通过人工移动像素坐标得到的两个视点之间没有刚性变换,因此没有满足要求的基本矩阵。更好的测试用例可能是使用cv :: warpPerspective等函数和已知的warp矩阵。

答案 1 :(得分:1)

  

1)使用不同的拟合算法会产生不同的结果,   特别是FM_8POINT是不同的。

不同的方法不会给出相同的结果,这是真的:

  • 例如RANSAC(RANdom SAmple Consensus)是findFundamentalMat()中的默认方法,它使用一组包含一些先验异常值的随机点来估计变换的参数,它会产生一定的正确结果可能性。
  • 而FM_8POINT旨在找到具有8个点的参数并使用具有线性独立方程的系统。
  

2)给定一组点对(y,x),yFx = 0不满足并且是   总是大于0。

这意味着你发现的基本矩阵不正确(估计不好),这是由于你作为输入提供的纯粹翻译,实际上是不可能的(这是2个图像的退化情况)位于无穷远处的观点... (see epipolar geometry)

我希望它对你有所帮助...... 于连