我如何处理基本矩阵?

What do I do with the fundamental matrix?

我正在尝试从多个 2d 图像重建 3d 形状。 我计算了一个基本矩阵,但现在我不知道如何处理它。

我发现关于堆栈溢出和学术论文的多个相互矛盾的答案。 例如,Here 表示您需要根据基本矩阵计算旋转和平移矩阵。

Here 说你需要找到相机矩阵。

Here 说你需要找到同形异义词。

Here 说你需要找到对极线。

这是哪个?? (我该怎么做?我读过 the H&Z book 但我不明白。它说我可以 'easily' 在结果 9.14 中使用 'direct formula',但结果 9.14 既不简单也不直接理解。)

堆栈溢出需要代码,所以这是我目前拥有的代码:

    # let's create some sample data

    Wpts = np.array([[1, 1, 1, 1],  # A Cube in world points
                     [1, 2, 1, 1],
                     [2, 1, 1, 1],
                     [2, 2, 1, 1],
                     [1, 1, 2, 1],
                     [1, 2, 2, 1],
                     [2, 1, 2, 1],
                     [2, 2, 2, 1]])


    Cpts = np.array([[0, 4, 0, 1],  #slightly up
                     [4, 0, 0, 1],
                     [-4, 0, 0, 1],
                     [0, -4, 0, 1]])
    Cangles = np.array([[0, -1, 0],  #slightly looking down
                        [-1, 0, 0],
                        [1, 0, 0],
                        [0,1,0]])



    views = []
    transforms = []
    clen = len(Cpts)
    for i in range(clen):
        cangle = Cangles[i]
        cpt = Cpts[i]

        transform = cameraTransformMatrix(cangle, cpt)
        transforms.append(transform)
        newpts = np.dot(Wpts, transform.T)
        view = cameraView(newpts)
        views.append(view)



H = cv2.findFundamentalMat(views[0], views[1])[0]
## now what???  How do I recover the cube shape?

编辑:我不知道相机参数

基本矩阵

先听fundamental matrix song ;).

基本矩阵 显示了 2 个图像(x' - 图像 2,x - 图像 1)中点对应之间的数学关系。 "That means, for all pairs of corresponding points holds eq1 " (Wikipedia)。这也意味着,如果你有离群点或不正确的点对应,它会直接影响你的基本矩阵的质量。

此外,3张图片之间的点对应关系也存在类似的结构,称为三焦张量。

不可能完全使用基本矩阵的属性进行 3d 重建,因为“对极几何是两个视图之间的内在射影几何。它是 独立于场景结构,只依赖于相机的内参 和相对姿势。”(HZ,第 239 页)。

相机矩阵

关于如何从多个图像重建形状的问题,您需要知道图像的相机矩阵 (K', K)。相机矩阵是由相机焦距或主距离(fx,fy)以及光学中心或主点(cx,cy)组成的3x3矩阵。


eq2

您可以使用相机标定导出相机矩阵。

基本矩阵

当您知道相机矩阵时,您可以将基本矩阵扩展为基本矩阵 E。


eq3

你可以说你的基本矩阵现在是 "calibrated"。

基本矩阵可用于获取第二张图像与第一张图像相比的旋转(旋转矩阵 R)和平移(矢量 t),仅达到 投影重建. t 将是单位向量。为此,您可以使用 OpenCV 函数 decomposeEssentialMatrecoverPose(使用手性检查)或阅读 HZ 中的详细说明。

投影矩阵

了解平移和旋转后,您就可以为图像构建投影矩阵。投影矩阵定义为eq4。最后,您可以使用三角测量 (triangulatePoints) 来导出图像点的 3d 坐标。我建议使用后续的捆绑调整来接收正确的配置。 openCV中也有一个sfm模块。

由于单应性或对极线知识对于 3d 重建不是必需的,因此我没有解释这些概念。

使用基本矩阵,您可以按照规定的规范形式确定相机矩阵 P 和 P' (HZ,pp254-256)。从这些相机矩阵中,理论上您可以三角测量投影重建,该投影重建在未知投影变换方面不同于真实场景。

必须注意,线性三角剖分方法不适用于投影重建,如中所述 (HZ,Discussion,p313) [“...这两种线性方法都不太适合投影重建,因为它们不是投影不变的。”] 因此,应该使用所提到的推荐的三角测量技术来获得有价值的结果(这实际上需要更多的工作来实现)。

从这个投影重建中,您可以使用自校准方法,该方法可以在某些情况下工作,但不会产生您可以通过校准相机获得的准确性和鲁棒性,也无法利用基本矩阵来计算运动参数.