6

我有一个任务:

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

我的任务是我只有相机矩阵,它在这个动作中是恒定的,还有图像(超过 100 个)。现在我必须逐帧获取平移和旋转,并将其与现实世界中的旋转和平移进行比较(来自我拥有但仅用于比较的系统,我也证明了!)

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

  1. 使用 OpenCV Cookbook 中的 robustMatcher -works finde - 40-70 匹配每帧 - 可见看起来非常好!
  2. 我用 getFundamental() 得到了 basicMatrix。我使用了来自 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

这就是我的真实状态!

我的计划是:

  1. 对所有点进行三角测量以获得 3D 点
  2. 将框架 i 与框架 i++ 连接起来
  3. 以某种方式可视化我的 3D 点!

现在我的问题是:

  1. 这个强大的匹配器过时了吗?还有其他方法吗?
  2. 使用我在第二步中描述的这一点是错误的吗?必须用失真或其他方式转换它们吗?
  3. 我在这里提取的 R 和 t 是什么?是从camera1的角度看camera1和camera2之间的旋转和平移吗?
  4. 当我在圣经或论文或其他地方阅读时,我发现 R 和 t 有 4 种可能性!'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,但我认为我可以从我的结果中提取一个因素到我的比较值,然后它应该是相似的。

有人以前做过这样的事情吗?

很多人通过使用棋盘进行相机校准,但我不能使用这种方法来获取外部参数。

我知道视觉 sfm 可以以某种方式做到这一点。(在 youtube 上有一段视频,有人绕着一棵树走,并从这些图片中使用视觉 sfm 重建这棵树)这与我必须做的几乎相同。

最后一个问题:

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

4

2 回答 2

2

很多人通过使用棋盘进行相机校准,但我不能使用这种方法来获取外部参数。

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

我们知道相机矩阵和...

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

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

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

使用我在第二步中描述的这一点是错误的吗?必须用失真或其他方式转换它们吗?

您需要先取消径向失真,请参阅undistortPoints

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

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

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

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

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

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

于 2012-08-17T11:09:05.423 回答
1

在这篇文章“An Efficient Solution to the Five-Point Relative Pose Problem”中,Nistér 解释了一种非常好的方法来确定四种配置中的哪一种是正确的(谈论 R 和 T)。

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

OpenCV 具有 triangulate 功能,这只需要两个投影矩阵,即位于第一张和第二张图像中的点。检查 calib3d 模块。

于 2012-08-23T13:22:01.530 回答