从两个校准过的摄像机进行3D重建 - 这个管道中的错误在哪里?

s-l*_*low 10 opencv computer-vision 3d-reconstruction camera-calibration

有许多关于从已知内部校准的立体视图进行3D重建的帖子,其中一些是非常好的.我已经阅读了很多这些内容,根据我所阅读的内容,我正在尝试使用下面的管道/算法来计算我自己的3D场景重建.我将列出方法,然后在底部询问具体问题.

0.校准你的相机:

  • 这意味着检索照相机校准矩阵ķ 1和K 2为摄像机1和摄像机2.这些是3×3矩阵每个封装相机的内部参数:焦距,主点偏移/图像中心.这些不会改变,只要您不缩放或更改您录制的分辨率,您只需要为每个摄像机执行一次此操作.
  • 离线这样做.不要争吵.
  • 我使用的OpenCVCalibrateCamera()和棋盘程序,但是这个功能也包括在Matlab的摄像机标定工具箱.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 = K 2 T FK 1

3.对E的内部约束:

  • E应该遵守某些限制.特别是,如果被SVD分解成USV.t那么它的奇异值应该是= a, a, 0.S的前两个对角元素应该相等,第三个零.
  • 我很惊讶地在这里读到,如果在测试时不是这样,你可以选择从之前的分解中制作一个新的Essential矩阵,如下所示:E_new = U * diag(1,1,0) * V.t当然可以保证服从约束.你基本上人为地设置了S =(100,010,000).

4.全相机投影矩阵:

  • 有两个相机投影矩阵P 1和P 2.这些是3x4并遵守这种x = PX关系.此外,P = K[R|t]因此K_inv.P = [R|t](相机校准已被删除).
  • 可以将第一矩阵P 1(不包括校准矩阵K)设置为[I|0]P 2(不包括K)R|t
  • 从E的分解计算两个摄像机R,t之间的旋转和平移.有两种可能的方法来计算R(U*W*V.tU*W.t*V.t)和两种计算t的方法(±第三列的U),这意味着有四种组合的Rt,其中只有一个是有效的.
  • 计算所有四种组合,并选择几何上与重建点位于两个摄像机前面的情况相对应的组合.我实际上是通过执行并计算得到的P 2 = [R | t]并在归一化坐标中对几个对应的三维位置进行三角测量来确保它们具有正深度(z-coord)

5.三维三角形

  • 最后,与它们各自的校准矩阵合并回收的3×4投影矩阵:P ' 1 = K 1 P 1和P' 2 = K 2 P 2
  • 并相应地对每个2d点对应的3空间坐标进行三角测量,我从这里使用LinearLS方法.

问题:

  • 这种方法中是否有任何嚎叫的遗漏和/或错误?
  • 我的F矩阵显然是准确的(映射与典型坐标值相比偏差为0.22%),但是当x'Ex = 0使用归一化图像对应测试E时,该映射中的典型误差大于标准化坐标本身的100%.测试E是否xEx = 0有效,如果是,那么错误的跳跃来自哪里?
  • 当使用RANSAC时,基本矩阵估计中的误差明显比8pt算法差,在x和x'之间的映射中±50px.这让我很担心.
  • "执行内部约束"对我来说仍然非常奇怪 - 如何从原始分解的一部分制造新的Essential矩阵是否有效?
  • 是否有更有效的方法来确定使用哪个R和t组合比计算P和三角测量一些标准化坐标?
  • 我的最终重投影误差是720p图像中的数百像素.我是否可能在校准,确定P-矩阵或三角测量方面遇到问题?

who*_*9vy 4

\n

当使用 RANSAC 时,我的基本 matr1ix 估计中的误差明显比 8pt 算法更严重,\nx 和 x' 之间的映射中的 \xc2\xb150px。这让我深感担忧。

\n
\n\n

使用8pt算法并不排除使用RANSAC原理。\n直接使用8pt算法时使用哪些点?你必须自己选择8(好)分。

\n\n

理论上,您可以从任何点对应关系计算基本矩阵,并且通常会得到退化基本矩阵,因为线性方程不是独立的。另一点是,8pt 算法使用超定线性方程组,因此单个异常值将破坏基本矩阵。

\n\n

您是否尝试过使用 RANSAC 结果?我敢打赌它代表了 F 的正确解决方案之一。

\n\n
\n

我的 F 矩阵显然是准确的(与典型坐标值相比,映射中的偏转为 0.22%),但是当使用归一化图像对应测试 E 针对 x'Ex = 0 时,映射中的典型误差 >100%标准化坐标本身。针对 xEx = 0 测试 E 是否有效?如果有效,错误跳转从何而来?

\n
\n\n

同样,如果 F 是退化的,则 x' F x = 0 可以对于每个点对应。

\n\n

E不正确的另一个原因可能是相机的切换(K1T * E * K2而不是K2T * E * K1)。请记住检查:x'Ex = 0

\n\n
\n

“强制执行内部约束”对我来说仍然很奇怪 - 仅从原始分解的一部分制造一个新的基本矩阵怎么可能有效?

\n
\n\n

Hartley 和 Zisserman 的“计算机视觉中的多视图几何”对此进行了解释。据我所知,这与 F 的弗罗贝尼乌斯范数的最小化有关。

\n\n

你可以Google一下,里面有pdf资源。

\n\n
\n

是否有比计算 P 和三角测量一些归一化坐标更有效的方法来确定使用 R 和 t 的组合?

\n
\n\n

据我所知没有。

\n\n
\n

我的最终重投影误差是 720p 图像中的数百个像素。我可能会在校准、确定 P 矩阵或三角测量中遇到问题吗?

\n
\n\n

您的刚体变换 P2 不正确,因为 E 不正确。

\n