有很多关于从已知内部校准的立体视图进行 3D 重建的帖子,其中一些是出色的 https://stackoverflow.com/questions/16639106/camera-motion-from-corresponding-images。我读过一篇lot其中,根据我所读到的内容,我尝试使用下面的管道/算法来计算我自己的 3D 场景重建。我将列出方法,然后在底部提出具体问题。
0. 校准您的相机:
- This means retrieve the camera calibration matrices K1 and K2 for Camera 1 and Camera 2. These are 3x3 matrices encapsulating each camera's internal parameters: focal length, principal point offset / image centre. These don't change, you should only need to do this once, well, for each camera as long as you don't zoom or change the resolution you record in.
- 离线执行此操作。不要争吵。
- 我在用着OpenCV http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html's
CalibrateCamera()
和棋盘例程,但此功能也包含在Matlab相机标定工具箱 http://www.vision.caltech.edu/bouguetj/calib_doc/。 OpenCV 例程似乎运行良好。
1. 基本矩阵F:
- 现在您的相机已设置为立体声设备。使用两个图像/视图之间的点对应关系确定该配置的基本矩阵 (3x3)。
- 如何获得对应信息取决于您,并且在很大程度上取决于场景本身。
- 我正在使用 OpenCV
findFundamentalMat()
得到 F,它提供了许多明智的选项(8 点算法、RANSAC、LMEDS)。
- 您可以通过将结果矩阵代入基本矩阵的定义方程来测试它:
x'Fx = 0
其中 x' 和 x 是原始图像点对应关系(x, y)
在齐次坐标中(x, y, 1)
并且三个向量之一被转置,使得乘法有意义。每个对应关系越接近零,F 就越服从其关系。这相当于检查导出的 F 实际上从一个图像平面映射到另一个图像平面的效果如何。使用 8 点算法,我得到的平均偏转约为 2px。
2. 基本矩阵E:
- 直接根据 F 和校准矩阵计算基本矩阵。
- E = K2TFK1
3. E 的内部约束:
- E应该遵守一定的约束。特别地,如果通过 SVD 分解为
USV.t
那么它的奇异值应该是 =a, a, 0
。 S 的前两个对角线元素应该相等,第三个为零。
- 我很惊讶地读到here https://stackoverflow.com/questions/16639106/camera-motion-from-corresponding-images如果在测试时情况并非如此,您可能会选择从先前的分解中构造一个新的基本矩阵,如下所示:
E_new = U * diag(1,1,0) * V.t
这当然保证遵守约束。您基本上人为地设置了 S = (100,010,000)。
4.全相机投影矩阵:
- There are two camera projection matrices P1 and P2. These are 3x4 and obey the
x = PX
relation. Also, P = K[R|t]
and therefore K_inv.P = [R|t]
(where the camera calibration has been removed).
- The first matrix P1 (excluding the calibration matrix K) can be set to
[I|0]
then P2 (excluding K) is R|t
- 根据 E 的分解计算两个摄像机之间的旋转和平移 R, t。有两种可能的方法来计算 R (
U*W*V.t
and U*W.t*V.t
)和两种计算 t(±U 的第三列)的方法,这意味着有四种组合Rt
,只有其中之一有效。
- Compute all four combinations, and choose the one that geometrically corresponds to the situation where a reconstructed point is in front of both cameras. I actually do this by carrying through and calculating the resulting P2 = [R|t] and triangulating the 3d position of a few correspondences in normalised coordinates to ensure that they have a positive depth (z-coord)
5. 3D 三角测量
- Finally, combine the recovered 3x4 projection matrices with their respective calibration matrices: P'1 = K1P1 and P'2 = K2P2
- 并相应地对每个 2d 点对应的 3 空间坐标进行三角测量,为此我使用 LinearLS 方法here http://www.morethantechnical.com/2012/01/04/simple-triangulation-with-opencv-from-harley-zisserman-w-code/.
问题:
- 该方法是否存在任何遗漏和/或错误?
- 我的 F 矩阵显然是准确的(与典型坐标值相比,映射中的偏转为 0.22%),但是当测试 E 时
x'Ex = 0
using 归一化图像对应映射中的典型误差 > 归一化坐标本身的 100%。正在测试 ExEx = 0
有效,如果是的话,错误跳转从何而来?
- 使用 RANSAC 时,我的基本矩阵估计的误差比 8pt 算法严重得多,在 x 和 x' 之间的映射中为 ±50px。这让我深感担忧。
- “强制执行内部约束”对我来说仍然很奇怪 - 仅从原始矩阵的部分分解中制造一个新的基本矩阵怎么可能有效?
- 有没有比计算 P 和对一些归一化坐标进行三角测量更有效的方法来确定使用 R 和 t 的组合?
- 我的最终重投影误差是 720p 图像中的数百个像素。我是否可能会关注校准、P 矩阵确定或三角测量中的问题?
我的基本 matr1ix 估计的错误明显更严重
当使用RANSAC比8pt算法时,之间的映射±50px
x 和 x'。这让我深感担忧。
使用8pt算法并不排除使用RANSAC原理。
直接使用8pt算法时使用哪些点?你必须自己选择8(好)分。
理论上,您可以从任何点对应关系计算基本矩阵,并且通常会得到退化基本矩阵,因为线性方程不是独立的。另一点是,8pt 算法使用超定线性方程组,因此单个异常值将破坏基本矩阵。
您是否尝试过使用 RANSAC 结果?我敢打赌它代表了 F 的正确解决方案之一。
我的 F 矩阵显然是准确的(映射中的偏转为 0.22%)
与典型坐标值相比),但是当测试 E 时
x'Ex = 0 使用归一化图像对应的典型误差
该映射大于标准化坐标本身的 100%。是
测试 E 对 xEx = 0 是否有效,如果是这样,错误跳转在哪里
来自(哪里?
同样,如果 F 退化,则 x'Fx = 0 可以对每个点进行对应。
E不正确的另一个原因可能是相机的切换(K1T * E * K2而不是K2T * E * K1)。请记住检查:x'Ex = 0
“加强内部约束”对我来说仍然很奇怪 -
仅从其中制造一个新的基本矩阵如何有效?
原来的部分分解了?
Hartley 和 Zisserman 的“计算机视觉中的多视图几何”对此进行了解释。据我所知,这与 F 的弗罗贝尼乌斯范数的最小化有关。
你可以Google一下,里面有pdf资源。
有没有更有效的方法来确定 R 和 t 的组合
使用比计算 P 和三角测量一些归一化
坐标?
据我所知没有。
我的最终重投影误差是 720p 图像中的数百个像素。是
我可能会关注校准、确定中的问题
P 矩阵还是三角剖分?
您的刚体变换 P2 不正确,因为 E 不正确。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)