有很多关于从已知内部校准的立体视图进行3D重建的帖子,其中一些非常棒。我已经读了很多,根据我所读的内容,我正试图用下面的管道/算法计算我自己的3D场景重建。我将列出方法,然后在底部提出具体问题。
0。校准您的相机:
- 这意味着检索相机1和相机2的相机校准矩阵K1和K2。这些是3x3矩阵,封装了每个相机的内部参数:焦距、主点偏移/图像中心。这些不会改变,你只需要为每台相机做一次,只要你不缩放或改变你录制的分辨率
- 脱机执行此操作。不要争论
- 我使用的是OpenCV的
CalibrateCamera()
和棋盘例程,但此功能也包含在Matlab相机校准工具箱中。OpenCV例程似乎工作得很好
1.基本矩阵F:
- 现在将您的相机设置为立体装备。使用两个图像/视图之间的点对应关系来确定该配置的基本矩阵(3x3)
- 你如何获得对应关系取决于你自己,在很大程度上取决于场景本身
- 我使用OpenCV的
findFundamentalMat()
来获得F,它在方法上提供了许多选项(8点算法、RANSAC、LMEDS) - 您可以通过将所得矩阵插入基本矩阵的定义方程来测试:
x'Fx = 0
,其中x'和x是齐次坐标(x, y, 1)
中的原始图像点对应关系(x, y)
,并且三个向量中的一个被转置,因此乘法是有意义的。每个对应关系越接近零,F就越能服从它的关系。这相当于检查导出的F从一个图像平面映射到另一个图像面的实际效果。使用8点算法,我得到了约2px的平均偏转
2.基本矩阵E:
- 直接从F和校准矩阵计算本质矩阵
- E=K2TFK1
3.E的内部约束:
- E应该遵守某些约束。特别地,如果SVD分解为
USV.t
,则其奇异值应为=a, a, 0
。S的前两个对角线元素应该相等,第三个元素为零 - 我很惊讶地在这里读到,如果在测试时这不是真的,你可能会选择从先前的分解中制造一个新的Essential矩阵,比如
E_new = U * diag(1,1,0) * V.t
,它当然保证遵守约束。您实际上已经人为地设置了S=(100010000)
4.全相机投影矩阵:
- 有两个相机投影矩阵P1和P2。它们是3x4,服从
x = PX
关系。此外,P = K[R|t]
,因此K_inv.P = [R|t]
(其中相机校准已被移除) - 第一个矩阵P1(不包括校准矩阵K)可以设置为
[I|0]
,然后P2为R|t
- 根据E的分解计算两个相机R,t之间的旋转和平移。有两种可能的方法来计算R(
U*W*V.t
和U*W.t*V.t
),也有两种方法来计算t(U的±第三列),这意味着Rt
有四种组合,其中只有一种是有效的 - 计算所有四个组合,并选择一个几何上对应于重建点在两个相机前面的情况的组合。实际上,我是通过执行和计算得到的P2=[R|t]来实现这一点的,并在归一化坐标中对几个对应关系的三维位置进行三角测量,以确保它们具有正深度(z-coord)
5.在3D中进行三角测量
- 最后,将恢复的3x4投影矩阵与其各自的校准矩阵组合:P'1=K1P1和P'2=K2P2
- 并相应地对每个2d点对应关系的3空间坐标进行三角测量,我从这里开始使用LinearLS方法
问题:
- 此方法中是否存在严重遗漏和/或错误
- 我的F矩阵显然是准确的(与典型坐标值相比,映射中的偏差为0.22%),但当使用归一化图像对应关系对
x'Ex = 0
测试E时,该映射中的典型误差大于归一化坐标本身的100%。针对xEx = 0
测试E有效吗?如果有效,那么错误的跳跃来自哪里 - 当使用RANSAC时,我的基本矩阵估计中的误差明显比8pt算法差,在x和x'之间的映射中为±50px。这让我深感担忧
- "强制执行内部约束"仍然让我感到非常奇怪——仅仅从原始矩阵的部分分解中制造一个新的Essential矩阵怎么可能有效
- 有没有比计算P和对一些归一化坐标进行三角测量更有效的方法来确定R和t的组合
- 我最后的重新投影错误是720p图像中的数百个像素。我可能会在校准、确定P-矩阵或三角测量中遇到问题吗
我的基本matr1ix估计中的误差明显更糟当使用RANSAC比8pt算法时,±50px之间的映射x和x'。这让我深感担忧。
使用8pt算法并不排除使用RANSAC原理。当直接使用8pt算法时,您使用哪些点?你必须自己选择8分(好)。
在理论上,你可以从任何点的对应关系计算基本矩阵,并且你经常得到退化的基本矩阵,因为线性方程不是独立的。另一点是,8pt算法使用了一个超定线性方程组,因此一个孤立点会破坏基本矩阵。
你试过使用RANSAC结果吗?我打赌它代表了F.的正确解决方案之一
My F矩阵显然是准确的(映射中偏移0.22%与典型坐标值相比),但当针对使用归一化图像对应的x'Ex=0该映射是归一化坐标本身的>100%。是针对xEx=0测试E有效,如果有效,那么错误的跳跃在哪里来自?
同样,如果F退化,则x'Fx=0可以用于每个点对应。
错误E的另一个原因可能是摄像头的开关(K1T*E*K2而不是K2T*E*K1)。记得检查:x'Ex=0
"强制内部约束"仍然让我感到非常奇怪-从原来分解的部分?
在Hartley和Zisserman的"计算机视觉中的多视图几何"中对此进行了解释。据我所知,这与F.的Frobenius范数的最小化有关
你可以在谷歌上搜索,那里有pdf资源。
有没有更有效的方法来确定R和t的组合使用比计算P和三角化一些归一化坐标?
据我所知,没有。
我最后的重新投影错误是720p图像中的数百个像素。是我可能会在校准、确定P-矩阵还是三角测量?
刚体变换P2不正确,因为E不正确。