Open CV - SfM的几种方法

Ter*_*ept 6 opencv computer-vision camera-calibration

我有一个任务:

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

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

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

  1. 使用OpenCV Cookbook中的robustMatcher - 作品finde - 40-70每帧匹配 - 可见看起来非常好!
  2. 我用getFundamental()得到了基本矩阵.我使用robustMatcher和RANSAC的健壮点.
  3. 当我拿到F时我可以使用我的CameraMatrix K获得Essentialmatrix E,如下所示:

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
Run Code Online (Sandbox Code Playgroud)

这是我的实际状态!

我的计划是:

  1. 三角测量所有点以获得3D点数
  2. 使用帧i ++加入第i帧
  3. 想象我的3D以某种方式指出它们!

现在我的问题是:

  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,但我想我可以从我的结果中提取一个因子到我的比较值,然后它应该是类似的.

有人之前做过这样的事吗?

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

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

最后一个问题:

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

fir*_*ant 2

很多人用棋盘进行相机标定,但我无法使用这种方法来获取外在参数。

国际象棋棋盘或棋盘用于查找内部/固有矩阵/参数,而不是外部参数。你是说你已经有了内部矩阵,我想这就是你的意思

我们知道相机矩阵并且......

你在youtube上看到的那些视频也做了同样的事情,相机已经被校准了,也就是说内部矩阵是已知的。

这个强大的匹配器过时了吗?还有其他方法吗?

我没有那本书,所以看不到代码并回答这个问题。

按照我的第二步所述使用这些点是否错误?它们必须通过扭曲或其他方式进行转换吗?

您需要首先取消径向扭曲,请参阅unactorPoints

我在这里提取的 R 和 t 是什么?是从camera1的角度来看camera1和camera2之间的旋转和平移吗?

R 是第二个相机在第一个相机坐标系中的方向。T 是第二个摄像机在该坐标系中的位置。这些有多种用途。

当我阅读圣经、论文或其他地方时,我发现有 4 种可能性......

阅读圣经的相关部分,那里解释得很好,三角测量是幼稚的方法,那里解释了更好的方法。

有人知道一种简单的方法来可视化我的 3D 点吗?

要在 Meshlab 中查看它们,一种非常简单的方法是将 3D 点的坐标保存在 PLY 文件中,这是一种非常简单的格式,Meshlab 和几乎所有其他 3D 模型查看器都支持。