我有一个任务:
我们有一个系统工作,其中相机围绕人头绕半圈。我们知道相机矩阵和每一帧的旋转/平移。(失真等等......但我想首先在没有这些参数的情况下工作)
我的任务是我只有相机矩阵,它在这个动作中是恒定的,还有图像(超过 100 个)。现在我必须逐帧获取平移和旋转,并将其与现实世界中的旋转和平移进行比较(来自我拥有但仅用于比较的系统,我也证明了!)
到目前为止我所做的第一步:
- 使用 OpenCV Cookbook 中的 robustMatcher -works finde - 40-70 匹配每帧 - 可见看起来非常好!
- 我用 getFundamental() 得到了 basicMatrix。我使用了来自 robustMatcher 和 RANSAC 的稳健点。
- 当我得到 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
这就是我的真实状态!
我的计划是:
- 对所有点进行三角测量以获得 3D 点
- 将框架 i 与框架 i++ 连接起来
- 以某种方式可视化我的 3D 点!
现在我的问题是:
- 这个强大的匹配器过时了吗?还有其他方法吗?
- 使用我在第二步中描述的这一点是错误的吗?必须用失真或其他方式转换它们吗?
- 我在这里提取的 R 和 t 是什么?是从camera1的角度看camera1和camera2之间的旋转和平移吗?
- 当我在圣经或论文或其他地方阅读时,我发现 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.vt
和t = svd.u.col(2); //=u3
为什么这是正确的?如果不是 - 我将如何在 OpenCV 中进行这种三角测量?我将这个翻译与给我的翻译进行了比较。(首先我必须将平移和旋转与 camera1 相关,但我现在得到了这个!)但它不一样。我的程序的值只是让我们称它为从正数跳到负数。但它应该更恒定,因为相机在一个恒定的圆圈中移动。我确信某些轴可能会被切换。我知道翻译只是从 -1 到 1,但我认为我可以从我的结果中提取一个因素到我的比较值,然后它应该是相似的。
有人以前做过这样的事情吗?
很多人通过使用棋盘进行相机校准,但我不能使用这种方法来获取外部参数。
我知道视觉 sfm 可以以某种方式做到这一点。(在 youtube 上有一段视频,有人绕着一棵树走,并从这些图片中使用视觉 sfm 重建这棵树)这与我必须做的几乎相同。
最后一个问题:
有人知道可视化我的 3D 点的简单方法吗?我更喜欢MeshLab。有这方面的经验吗?