Computer vision 推广“;中点&x201D;n点三角剖分方法

Computer vision 推广“;中点&x201D;n点三角剖分方法,computer-vision,triangulation,Computer Vision,Triangulation,在计算机视觉中,“中点”方法解决了从两个2D点确定3D点的三角剖分问题(参见)。是否有一个超过两个点的概括,比如说n个点,它叫什么?这篇文章确实提到了直接线性变换,但我不确定这是我想要的…是的,有一个推广到N点的方法。我在一些文章中看到了这一点: p.A.比尔兹利、A.齐瑟曼和D.W.默里。投影函数的顺序更新 运动的仿射结构。国际计算机杂志。《愿景》,23(3):235-25997年6月 Srikumar Ramalingam、Suresh K.Lodha和Peter Sturm。一般结构- 从

在计算机视觉中,“中点”方法解决了从两个2D点确定3D点的三角剖分问题(参见)。是否有一个超过两个点的概括,比如说n个点,它叫什么?这篇文章确实提到了直接线性变换,但我不确定这是我想要的…

是的,有一个推广到N点的方法。我在一些文章中看到了这一点:

p.A.比尔兹利、A.齐瑟曼和D.W.默里。投影函数的顺序更新 运动的仿射结构。国际计算机杂志。《愿景》,23(3):235-25997年6月

Srikumar Ramalingam、Suresh K.Lodha和Peter Sturm。一般结构- 从运动框架。计算机。维斯。下图,103(3):218-228年9月 2006年

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

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

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

我希望这会有所帮助。

正如Fleurmond所建议的,中点三角剖分到n视图的一般化如下所示:

Srikumar Ramalingam、Suresh K.Lodha和Peter Sturm。通用结构-来自运动框架。计算机。维斯。下图,103(3):218-2282006年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))

非常感谢。最后我自己算出了方程式,解决了这个问题。