Open CV - SfM的几种方法

时间:2012-08-13 16:07:16

标签: opencv computer-vision camera-calibration

我有一个任务:

我们有一个系统工作,相机在人头周围做半圈。我们知道相机矩阵和每帧的旋转/平移。 (失真和更多...但我想首先没有这些参数工作)

我的任务是我只有相机矩阵,它在此移动时保持不变,以及图像(超过100)。现在我必须逐帧进行平移和旋转,并将其与现实世界中的旋转和平移进行比较(来自我所拥有的系统,但仅用于比较,我也证明了它!)

到目前为止我做的第一步:

  1. 使用OpenCV Cookbook中的robustMatcher - 作品finde - 40-70每帧匹配 - 可见看起来非常好!
  2. 我使用getFundamental()获取基本矩阵。我使用robustMatcher和RANSAC的健壮点。
  3. 当我拿到F时,我可以使用我的CameraMatrix K获得Essentialmatrix E:
  4. cv::Mat E = K.t() * F * K; //Found at the Bible HZ Chapter 9.12

    现在我们需要用SVD从E中提取R和t。顺便说一句,camera1的位置只是零,因为我们必须从某个地方开始。

    cv::SVD svd(E);
    cv::SVD svd(E);
    
    cv::Matx33d W(0,-1,0,   //HZ 9.13
              1,0,0,
              0,0,1);
    
     cv::Matx33d Wt(0,1,0,//W^
            -1,0,0,
            0,0,1);
    
     cv::Mat R1 = svd.u * cv::Mat(W)  * svd.vt; //HZ 9.19
     cv::Mat R2 = svd.u * cv::Mat(Wt) * svd.vt; //HZ 9.19
    
     //R1 or R2???
     R = R1; //R2
    
     //t=+u3 or t=-u3?
     t = svd.u.col(2); //=u3
    

    这是我的实际状态!

    我的计划是:

    1. 对所有点进行三角测量以获得3D点数
    2. 使用第i ++帧加入第i帧
    3. 想象我的3D以某种方式指出它们!
    4. 现在我的问题是:

      1. 这个强大的匹配日期是?还有其他方法吗?
      2. 在我的第二步中使用这些点是不对的?它们必须被扭曲或其他东西转换吗?
      3. 这里我提取的R和t是什么?它是camera1和camera2之间的旋转和平移,从camera1的角度来看?
      4. 当我在圣经或论文或其他地方阅读时,我发现R和t有四种可能性! 'P'= [UWV ^ T | + u3] oder [UWV ^ T | -u3] oder [UW ^ TV ^ T | + u3] oder [UW ^ TV ^ T | -u3]' P'是第二图像的投影矩阵。 这意味着t可能是 - 或+和R可能是完全不同的?! 我发现我应该在3D中计算一个点并找出这一点是否在两个相机前面,然后我找到了正确的矩阵! 我在互联网上找到了一些代码,他只是说这个没有进一步的计算: cv::Mat R1 = svd.u * cv::Mat(W) * svd.vtt = svd.u.col(2); //=u3 为什么这是正确的?如果不是 - 我将如何在OpenCV中进行这种三角测量? 我把这个翻译与给我的翻译进行了比较。 (首先我必须将翻译和旋转转移到camera1,但我现在得到了这个!)但它不一样。我的程序的值只是让我们称它从加上跳过太减去。但它应该更加稳定,因为相机在一个恒定的圆圈中移动。 我确信有些轴可能会被切换。我知道翻译只是从-1到1,但我想我可以从我的结果中提取一个因子到我的比较值,然后它应该是类似的。
      5. 有人之前做过这样的事吗?

        许多人使用棋盘进行相机校准,但我无法使用此方法获取外部参数。

        我知道视觉系统可以以某种方式做到这一点。 (在youtube上是一个视频,有人在树上走动,从这些图片中获取使用visual sfm重建这棵树) 这与我必须做的完全一样。

        上一个问题:

        有人知道可视化我的3D积分的简单方法吗?我更喜欢MeshLab。有一些经验吗?

1 个答案:

答案 0 :(得分:1)

在本文“五点相对姿势问题的有效解决方案”中,Nistér解释了一种非常好的方法来确定四种配置中的哪一种是正确的(谈论R和T)。

我尝试过强大的匹配器,我觉得很安静。这个匹配器的问题是因为它使用SURF非常慢,也许你应该尝试使用其他探测器和提取器来提高速度。我也相信OpenCV中计算基本矩阵的函数不需要Ransac参数,因为方法率和对称性很好地去除异常值,你应该尝试8点参数。

OpenCV具有三角函数,这只需要两个投影矩阵,即第一和第二图像中的点。检查calib3d模块。