8

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

我在堆栈溢出和学术论文上发现了多个相互矛盾的答案。例如,Here说您需要从基本矩阵计算旋转和平移矩阵。

这里说你需要找到相机矩阵。

这里说你需要找到单应性。

这里说你需要找到极线。

是哪个??(我该怎么做?我读过H&Z 的书,但我不明白。它说我可以在结果 9.14 中“轻松”使用“直接公式”,但结果 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?

编辑:我不知道相机参数

4

2 回答 2

15

基本矩阵

首先,听基本的矩阵歌曲;)。

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

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

仅使用基本矩阵属性的 3d 重建是不可能的,因为“对极几何是两个视图之间的内在投影几何。它独立于场景结构,仅取决于相机的内部参数和相对姿势。” (赫兹,第 239 页)。

相机矩阵

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


eq2

您可以使用相机校准导出相机矩阵。

基本矩阵

当您了解相机矩阵时,您可以将基本矩阵扩展到基本矩阵 E。


eq3

您可以说您的基本矩阵现在已“校准”,这很草率。

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

投影矩阵

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

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

于 2019-11-25T08:58:49.580 回答
0

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

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

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

于 2019-12-29T14:09:25.317 回答