两个校准相机的 3D 重建 - 这条管道中的错误在哪里?
3D reconstruction from two calibrated cameras - where is the error in this pipeline?
关于从已知内部校准的立体视图进行 3D 重建的帖子有很多,其中一些是 excellent。我已经阅读了其中的 lot,并且根据我所阅读的内容,我正在尝试使用以下管道/算法计算我自己的 3D 场景重建。我会把方法列出来,然后在底部提出具体问题。
0。校准你的相机:
- 这意味着检索相机 1 的相机 校准 矩阵 K1 和 K2和相机 2。这些是封装每个相机内部参数的 3x3 矩阵:焦距、主点偏移/图像中心。这些都不会改变,你应该只需要为每个相机做一次,只要你不缩放或改变你记录的分辨率。
- 离线进行。不争。
- 我正在使用 OpenCV's
CalibrateCamera()
and checkerboard routines, but this functionality is also included in the Matlab Camera Calibration toolbox。 OpenCV 例程似乎运行良好。
1.基本矩阵 F:
- 您的相机现已设置为立体装置。使用两个 images/views.
之间的点对应关系确定该配置的基本矩阵 (3x3)
- 如何获取对应关系由你决定,很大程度上取决于场景本身。
- 我正在使用 OpenCV 的
findFundamentalMat()
来获取 F,它提供了一些明智的选项方法(8 点算法、RANSAC、LMEDS)。
- 您可以通过将结果矩阵代入基本矩阵的定义方程来测试结果矩阵:
x'Fx = 0
其中 x' 和 x 是齐次坐标 (x, y)
中的原始图像点对应 [=14] =] 并且三个向量之一被转置以便乘法有意义。每个对应关系越接近零,F 服从它的关系就越好。这相当于检查派生的 F 实际上从一个图像平面映射到另一个图像平面的效果如何。我使用 8 点算法得到 ~2px 的平均偏转。
2。基本矩阵 E:
- 直接从 F 和校准矩阵计算基本矩阵。
- E = K2TFK1
3。 E 的内部约束:
- E应该遵守一定的约束条件。特别地,如果通过 SVD 分解为
USV.t
那么它的奇异值应该是 = a, a, 0
。 S的前两个对角线元素应该相等,第三个为零。
- 我很惊讶地读到 here 如果在测试时这不是真的,您可能会选择从先前的分解中构建一个新的基本矩阵,如下所示:
E_new = U * diag(1,1,0) * V.t
这是当然保证服从约束。您基本上人为地设置了 S = (100,010,000)。
4.全相机投影矩阵:
- 有两个相机投影矩阵P1和P2。这些是 3x4 并遵守
x = PX
关系。此外,P = K[R|t]
因此 K_inv.P = [R|t]
(相机校准已被删除)。
- 第一个矩阵P1(不包括校准矩阵K)可以设置为
[I|0]
然后P2(不包括 K) 是 R|t
- 从E的分解中计算两个相机R,t之间的旋转和平移。有两种可能的计算R的方法(
U*W*V.t
和U*W.t*V.t
)和两种计算t的方法(±U的第三列),表示Rt
有四种组合,只有一种有效
- 计算所有四种组合,并选择一种在几何上对应于重建点在两个摄像机前面的情况的组合。实际上,我通过执行并计算结果 P2 = [R|t] 并在归一化坐标中对一些对应关系的 3d 位置进行三角测量以确保它们具有正深度( z 坐标)
5. 3D 三角剖分
- 最后,将恢复的3x4投影矩阵与其各自的校准矩阵组合:P'1 = K1P1 和 P'2 = K2P2
- 并相应地对每个 2d 点对应的 3-space 坐标进行三角测量,为此我使用 here.
中的 LinearLS 方法
问题:
- 这个方法有没有啸叫遗漏and/or错误?
- 我的 F 矩阵显然是准确的(与典型坐标值相比,映射中有 0.22% 的偏差),但是当使用 标准化 图像对应对
x'Ex = 0
测试 E 时该映射中的典型错误是 >100% 的归一化坐标本身。针对 xEx = 0
测试 E 是否有效,如果有效,那么跳转错误来自哪里?
- 当使用 RANSAC 时,我的基本矩阵估计的误差明显比 8pt 算法差,x 和 x' 之间的映射为 ±50px。这让我深感忧虑。
- 'Enforcing the internal constraint' 仍然让我觉得很奇怪——仅仅从原始矩阵的一部分分解来制造一个新的 Essential 矩阵怎么可能有效?
- 有没有比计算 P 和三角化一些归一化坐标更有效的方法来确定使用哪个 R 和 t 的组合?
- 我最终的重投影错误是 720p 图像中的数百个像素。我可能会在校准、确定 P 矩阵或三角测量中寻找问题吗?
The error in my fundamental matr1ix estimation is significantly worse
when using RANSAC than the 8pt algorithm, ±50px in the mapping between
x and x'. This deeply concerns me.
使用8pt算法不排除使用RANSAC原则。
直接使用8pt算法时用到哪些点?您必须自己选择8个(好)点。
理论上你可以从任何点对应计算出一个基本矩阵,你经常得到一个退化的基本矩阵,因为线性方程不是独立的。还有一点就是8pt算法使用了一个超定的线性方程组,这样一个单独的异常值就会破坏基本矩阵。
您是否尝试过使用 RANSAC 结果?我打赌它代表了 F.
的正确解决方案之一
My F matrix is apparently accurate (0.22% deflection in the mapping
compared to typical coordinate values), but when testing E against
x'Ex = 0 using normalised image correspondences the typical error in
that mapping is >100% of the normalised coordinates themselves. Is
testing E against xEx = 0 valid, and if so where is that jump in error
coming from?
同样,如果F是退化的,x'Fx = 0可以为每个点对应。
你不正确 E 的另一个原因可能是相机的开关(K1T * E * K2 而不是 K2T * E * K1)。记得检查:x'Ex = 0
'Enforcing the internal constraint' still sits very weirdly with me -
how can it be valid to just manufacture a new Essential matrix from
part of the decomposition of the original?
Hartley 和 Zisserman 在 'Multiple View Geometry in Computer Vision' 中对此进行了解释。据我所知,它与 F 的 Frobenius 范数的最小化有关。
可以Google,而且还有pdf资源。
Is there a more efficient way of determining which combo of R and t to
use than calculating P and triangulating some of the normalised
coordinates?
据我所知没有。
My final re-projection error is hundreds of pixels in 720p images. Am
I likely looking at problems in the calibration, determination of
P-matrices or the triangulation?
你的刚体变换P2不正确,因为E不正确。
关于从已知内部校准的立体视图进行 3D 重建的帖子有很多,其中一些是 excellent。我已经阅读了其中的 lot,并且根据我所阅读的内容,我正在尝试使用以下管道/算法计算我自己的 3D 场景重建。我会把方法列出来,然后在底部提出具体问题。
0。校准你的相机:
- 这意味着检索相机 1 的相机 校准 矩阵 K1 和 K2和相机 2。这些是封装每个相机内部参数的 3x3 矩阵:焦距、主点偏移/图像中心。这些都不会改变,你应该只需要为每个相机做一次,只要你不缩放或改变你记录的分辨率。
- 离线进行。不争。
- 我正在使用 OpenCV's
CalibrateCamera()
and checkerboard routines, but this functionality is also included in the Matlab Camera Calibration toolbox。 OpenCV 例程似乎运行良好。
1.基本矩阵 F:
- 您的相机现已设置为立体装置。使用两个 images/views. 之间的点对应关系确定该配置的基本矩阵 (3x3)
- 如何获取对应关系由你决定,很大程度上取决于场景本身。
- 我正在使用 OpenCV 的
findFundamentalMat()
来获取 F,它提供了一些明智的选项方法(8 点算法、RANSAC、LMEDS)。 - 您可以通过将结果矩阵代入基本矩阵的定义方程来测试结果矩阵:
x'Fx = 0
其中 x' 和 x 是齐次坐标(x, y)
中的原始图像点对应 [=14] =] 并且三个向量之一被转置以便乘法有意义。每个对应关系越接近零,F 服从它的关系就越好。这相当于检查派生的 F 实际上从一个图像平面映射到另一个图像平面的效果如何。我使用 8 点算法得到 ~2px 的平均偏转。
2。基本矩阵 E:
- 直接从 F 和校准矩阵计算基本矩阵。
- E = K2TFK1
3。 E 的内部约束:
- E应该遵守一定的约束条件。特别地,如果通过 SVD 分解为
USV.t
那么它的奇异值应该是 =a, a, 0
。 S的前两个对角线元素应该相等,第三个为零。 - 我很惊讶地读到 here 如果在测试时这不是真的,您可能会选择从先前的分解中构建一个新的基本矩阵,如下所示:
E_new = U * diag(1,1,0) * V.t
这是当然保证服从约束。您基本上人为地设置了 S = (100,010,000)。
4.全相机投影矩阵:
- 有两个相机投影矩阵P1和P2。这些是 3x4 并遵守
x = PX
关系。此外,P = K[R|t]
因此K_inv.P = [R|t]
(相机校准已被删除)。 - 第一个矩阵P1(不包括校准矩阵K)可以设置为
[I|0]
然后P2(不包括 K) 是R|t
- 从E的分解中计算两个相机R,t之间的旋转和平移。有两种可能的计算R的方法(
U*W*V.t
和U*W.t*V.t
)和两种计算t的方法(±U的第三列),表示Rt
有四种组合,只有一种有效 - 计算所有四种组合,并选择一种在几何上对应于重建点在两个摄像机前面的情况的组合。实际上,我通过执行并计算结果 P2 = [R|t] 并在归一化坐标中对一些对应关系的 3d 位置进行三角测量以确保它们具有正深度( z 坐标)
5. 3D 三角剖分
- 最后,将恢复的3x4投影矩阵与其各自的校准矩阵组合:P'1 = K1P1 和 P'2 = K2P2
- 并相应地对每个 2d 点对应的 3-space 坐标进行三角测量,为此我使用 here. 中的 LinearLS 方法
问题:
- 这个方法有没有啸叫遗漏and/or错误?
- 我的 F 矩阵显然是准确的(与典型坐标值相比,映射中有 0.22% 的偏差),但是当使用 标准化 图像对应对
x'Ex = 0
测试 E 时该映射中的典型错误是 >100% 的归一化坐标本身。针对xEx = 0
测试 E 是否有效,如果有效,那么跳转错误来自哪里? - 当使用 RANSAC 时,我的基本矩阵估计的误差明显比 8pt 算法差,x 和 x' 之间的映射为 ±50px。这让我深感忧虑。
- 'Enforcing the internal constraint' 仍然让我觉得很奇怪——仅仅从原始矩阵的一部分分解来制造一个新的 Essential 矩阵怎么可能有效?
- 有没有比计算 P 和三角化一些归一化坐标更有效的方法来确定使用哪个 R 和 t 的组合?
- 我最终的重投影错误是 720p 图像中的数百个像素。我可能会在校准、确定 P 矩阵或三角测量中寻找问题吗?
The error in my fundamental matr1ix estimation is significantly worse when using RANSAC than the 8pt algorithm, ±50px in the mapping between x and x'. This deeply concerns me.
使用8pt算法不排除使用RANSAC原则。 直接使用8pt算法时用到哪些点?您必须自己选择8个(好)点。
理论上你可以从任何点对应计算出一个基本矩阵,你经常得到一个退化的基本矩阵,因为线性方程不是独立的。还有一点就是8pt算法使用了一个超定的线性方程组,这样一个单独的异常值就会破坏基本矩阵。
您是否尝试过使用 RANSAC 结果?我打赌它代表了 F.
的正确解决方案之一My F matrix is apparently accurate (0.22% deflection in the mapping compared to typical coordinate values), but when testing E against x'Ex = 0 using normalised image correspondences the typical error in that mapping is >100% of the normalised coordinates themselves. Is testing E against xEx = 0 valid, and if so where is that jump in error coming from?
同样,如果F是退化的,x'Fx = 0可以为每个点对应。
你不正确 E 的另一个原因可能是相机的开关(K1T * E * K2 而不是 K2T * E * K1)。记得检查:x'Ex = 0
'Enforcing the internal constraint' still sits very weirdly with me - how can it be valid to just manufacture a new Essential matrix from part of the decomposition of the original?
Hartley 和 Zisserman 在 'Multiple View Geometry in Computer Vision' 中对此进行了解释。据我所知,它与 F 的 Frobenius 范数的最小化有关。
可以Google,而且还有pdf资源。
Is there a more efficient way of determining which combo of R and t to use than calculating P and triangulating some of the normalised coordinates?
据我所知没有。
My final re-projection error is hundreds of pixels in 720p images. Am I likely looking at problems in the calibration, determination of P-matrices or the triangulation?
你的刚体变换P2不正确,因为E不正确。