我该如何处理基础矩阵?

10
我正在尝试从多个2D图像中重构3D形状。 我已经计算出了基础矩阵,但现在不知道该怎么办。 在Stack Overflow和学术论文中,我发现了多个相互冲突的答案。举个例子,这里说你需要从基础矩阵中计算旋转和平移矩阵。 这里说你需要找到相机矩阵。 这里说你需要找到单应性矩阵。 这里说你需要找到极线。 那究竟是哪个呢?(我该如何做?我读过H&Z书,但我不理解。它说我可以“轻松地”使用结果9.14中的“直接公式”,但结果9.14既不容易理解也不直接。) Stack Overflow需要代码,因此以下是我目前拥有的:
    # 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?

编辑:我不知道相机参数


基础矩阵不是提供有关相机运动/位移的信息吗?这样,您就可以通过射线交叉来使用立体重建(以最简单的方式)。但由于我还没有在这个领域工作过,所以可能会有错误。 - Micka
这正是我所想的,但我看到了关于如何做到这一点的矛盾报告。 - john k
1
这是一篇很棒的文章!我在计算机视觉/自动驾驶职位的面试中曾经遇到过这个问题。 - cdahms
2个回答

17

基本矩阵

首先,听一下基本矩阵之歌 ;)

基本矩阵显示您在两个图像(x' - 图像2、x - 图像1)中的点对应关系之间的数学关系。"这意味着,对于所有的对应点对来说都成立eq1 " (维基百科)。这也意味着,如果您有异常值或不正确的点对应关系,它会直接影响到您的基本矩阵质量。

此外,还存在一个类似的结构,用于描述 三张图片 上的点对应关系,称为三重张量。

仅使用基本矩阵属性进行三维重建是不可能的,因为“极线几何是两个视图之间的内在投影几何。它与场景结构无关,只取决于相机的内部参数和相对姿态。”(HZ, p.239)。

相机矩阵

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


eq2

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

本质矩阵

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


eq3

您可以粗略地说,您的基础矩阵现在已经“校准”。

本质矩阵可用于仅比较第一幅图像和第二幅图像来获取第二幅图像的旋转(旋转矩阵R)和平移(向量t)的信息,但只能得到一个射影重构。t将是一个单位向量。为此,可以使用OpenCV函数decomposeEssentialMatrecoverPose(使用对极约束检查),或在HZ中详细阅读进一步的解释。

投影矩阵

知道您的平移和旋转后,您可以为图像构建投影矩阵。投影矩阵定义为eq4。最后,您可以使用三角测量(triangulatePoints)推导出图像点的三维坐标。我建议使用连续的捆绑调整来获得正确的配置。OpenCV中也有一个sfm模块。

由于三维重建不需要了解单应性或极线知识,因此我没有解释这些概念。


抱歉,我没有相机参数/矩阵。 - john k
1
我假设你的图像大小为100x100像素。 如果你没有相机参数,你可以假设一个焦距(例如,你的图像尺寸fx,fy的0.75),并将光学中心设置为图像中心(cx=50,cy=50)。我想指出的是,最好校准相机或参考实际值(例如,在图像的EXIF中)。 - Grillteller
你说H&Z表示用基础矩阵无法重构场景,这很奇怪,因为在第265页明确表示相反的观点。 “如果一组点对应在两个视图中唯一确定了基础矩阵,则可以仅从这些对应关系重构场景和相机”。 - john k
3
我问作者这个方法现在是否有用。他回答说:“......我认为更好的方法是猜测每个图像的K矩阵,然后使用对应关系,利用图像对之间的五点法解决初始度量重建问题。即使您猜测焦距不正确,也不会阻止您进行初始度量重建,因为由于拍摄机架所导致的平移-变焦歧义,焦距通常与t存在大量的模糊性,所以您仍将能够形成初始的度量重建结果。并且,由于您永远不必经过降维处理,因此您的重新投影误差可能比使用投影方法时更低。” - Grillteller
1
这个答案在某种程度上是错误的。如果你知道基本矩阵,那么你就知道了一切。如果你只有本质矩阵,那么你没有相机内参。因此,基本矩阵用相机内参数丰富了本质矩阵。 - NMO
显示剩余4条评论

0

通过基础矩阵,您可以按照规范形式确定相机矩阵P和P'(如HZ,pp254-256所述)。从这些相机矩阵,您可以理论上三角化一个投影重建,该重建与真实场景在未知投影变换方面存在差异。

需要注意的是,线性三角化方法不适用于投影重建,如HZ讨论部分p313所述["...这两种线性方法都不太适合投影重建,因为它们不是投影不变的。"],因此,应使用推荐的三角化技术来获得有价值的结果(实际上需要更多的工作来实现)。

从这个投影重建中,您可以使用自标定方法,在某些情况下可以工作,但不会像使用校准相机和利用本质矩阵计算运动参数那样获得精度和鲁棒性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,