将三角剖分的“中点”方法推广到 n 个点

Generalisation of the “mid-point” method for triangulation to n points

在计算机视觉中,"mid-point" 方法解决了从两个 2D 点确定 3D 点的三角测量问题(参见 here)。是否可以将其推广到两个以上的点,比如 n 个点,它叫什么?文章确实提到了直接线性变换,但我不确定这是否是我要找的...

是的,有 N 个点的泛化。我在一些文章中看到过:

P. A. Beardsley、A. Zisserman 和 D. W. Murray。投影的顺序更新 和运动的仿射结构。诠释。 J. 计算。愿景,23(3):235–259,1997 年 6 月

Srikumar Ramalingam、Suresh K. Lodha 和 Peter Sturm。通用结构- 从运动框架。电脑。可见。 Image Underst., 103(3) :218–228, 九月 2006.

你也可以看看这本书(你的维基百科文章的参考)

理查德·哈特利和安德鲁·齐瑟曼 (2003)。计算机视觉中的多视图几何。剑桥大学出版社。书号 978-0-521-54051-3.

但我记得它没有提到 N 视图的中点,只有两个视图,而这种方法被描述为不准确(严格来说不是我的想法)。

希望对您有所帮助。

正如 Fleurmond 所建议的那样,中点三角剖分对 n 视图的概括在以下内容中给出:

Srikumar Ramalingam、Suresh K. Lodha 和 Peter Sturm。一个通用的运动结构框架。电脑。可见。 Image Underst., 103(3) :218–228, 2006 年 9 月

下面是 Python 中的示例代码:

import numpy as np
import numpy.linalg as npla

def midpoint_triangulate(x, cam):
    """
    Args:
        x:   Set of 2D points in homogeneous coords, (3 x n) matrix
        cam: Collection of n objects, each containing member variables
                 cam.P - 3x4 camera matrix
                 cam.R - 3x3 rotation matrix
                 cam.T - 3x1 translation matrix
    Returns:
        midpoint: 3D point in homogeneous coords, (4 x 1) matrix
    """

    n = len(cam)                                         # No. of cameras

    I = np.eye(3)                                        # 3x3 identity matrix
    A = np.zeros((3,n))
    B = np.zeros((3,n))
    sigma2 = np.zeros((3,1))

    for i in range(n):
        a = -np.transpose(cam[i].R).dot(cam[i].T)        # ith camera position
        A[:,i,None] = a

        b = npla.pinv(cam[i].P).dot(x[:,i])              # Directional vector
        b = b / b[3]
        b = b[:3,None] - a
        b = b / npla.norm(b)
        B[:,i,None] = b

        sigma2 = sigma2 + b.dot(b.T.dot(a))

    C = (n * I) - B.dot(B.T)
    Cinv = npla.inv(C)
    sigma1 = np.sum(A, axis=1)[:,None]
    m1 = I + B.dot(np.transpose(B).dot(Cinv))
    m2 = Cinv.dot(sigma2)

    midpoint = (1/n) * m1.dot(sigma1) - m2        
    return np.vstack((midpoint, 1))