Обобщение метода «средней точки» для триангуляции на n точек

В Computer Vision метод «средней точки» решает проблему триангуляции определения 3D-точки по двум 2D-точкам (см. здесь). Существует ли обобщение этого более чем на две точки, скажем, на n точек, и как это называется? В статье упоминается прямое линейное преобразование, но я не уверен, что это то, что я ищу...


person Pixel    schedule 28.02.2015    source источник


Ответы (2)


Да, есть обобщение на N точек. Я видел это в некоторых статьях:

П. А. Бердслей, А. Зиссерман и Д. В. Мюррей. Последовательное обновление проективной и аффинной структуры от движения. Междунар. Дж. Вычисл. Видение, 23(3): 235–259, июнь 1997 г.

Шрикумар Рамалингам, Суреш К. Лодха и Питер Штурм. Общая структура из движения. вычисл. Вис. Image Underst., 103 (3): 218–228, сентябрь 2006 г.

Вы также можете прочитать книгу (ссылка на вашу статью в Википедии)

Ричард Хартли и Эндрю Зиссерман (2003). Геометрия множественного просмотра в компьютерном зрении. Издательство Кембриджского университета. ISBN 978-0-521-54051-3.

Но он не упоминает среднюю точку для N просмотров, насколько я помню, только для двух просмотров, в то время как этот метод изображен как неточный (не совсем мое мышление).

Я надеюсь, что это будет полезно.

person Fleurmond    schedule 17.08.2015
comment
Спасибо. В конце концов я сам составил уравнения и решил задачу. - person Pixel; 17.08.2015

Как предложил Fleurmond, обобщение триангуляции средней точки на n-представления дано в:

Шрикумар Рамалингам, Суреш К. Лодха и Питер Штурм. Общая структура из движения. вычисл. Вис. Image Underst., 103(3): 218–228, сентябрь 2006 г.

P=(1/n){I3+B.BT.Cinv}.SIGMA(Ai) - Cinv.SIGMA(Bi.BiT.Ai)

Вот пример кода на 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))
person Nirmal    schedule 29.11.2016