我有一个任务:
我们有一个系统工作,相机在人头周围做半圈。我们知道相机矩阵和每帧的旋转/平移。 (失真和更多...但我想首先没有这些参数工作)
我的任务是我只有相机矩阵,它在此移动时保持不变,以及图像(超过100)。现在我必须逐帧进行平移和旋转,并将其与现实世界中的旋转和平移进行比较(来自我所拥有的系统,但仅用于比较,我也证明了它!)
到目前为止我做的第一步:
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
这是我的实际状态!
我的计划是:
现在我的问题是:
cv::Mat R1 = svd.u * cv::Mat(W) * svd.vt
和
t = svd.u.col(2); //=u3
为什么这是正确的?如果不是 - 我将如何在OpenCV中进行这种三角测量?
我把这个翻译与给我的翻译进行了比较。 (首先我必须将翻译和旋转转移到camera1,但我现在得到了这个!)但它不一样。我的程序的值只是让我们称它从加上跳过太减去。但它应该更加稳定,因为相机在一个恒定的圆圈中移动。
我确信有些轴可能会被切换。我知道翻译只是从-1到1,但我想我可以从我的结果中提取一个因子到我的比较值,然后它应该是类似的。 有人之前做过这样的事吗?
许多人使用棋盘进行相机校准,但我无法使用此方法获取外部参数。
我知道视觉系统可以以某种方式做到这一点。 (在youtube上是一个视频,有人在树上走动,从这些图片中获取使用visual sfm重建这棵树) 这与我必须做的完全一样。
上一个问题:
有人知道可视化我的3D积分的简单方法吗?我更喜欢MeshLab。有一些经验吗?
答案 0 :(得分:1)
在本文“五点相对姿势问题的有效解决方案”中,Nistér解释了一种非常好的方法来确定四种配置中的哪一种是正确的(谈论R和T)。
我尝试过强大的匹配器,我觉得很安静。这个匹配器的问题是因为它使用SURF非常慢,也许你应该尝试使用其他探测器和提取器来提高速度。我也相信OpenCV中计算基本矩阵的函数不需要Ransac参数,因为方法率和对称性很好地去除异常值,你应该尝试8点参数。
OpenCV具有三角函数,这只需要两个投影矩阵,即第一和第二图像中的点。检查calib3d模块。