В Computer Vision метод «средней точки» решает проблему триангуляции определения 3D-точки по двум 2D-точкам (см. здесь). Существует ли обобщение этого более чем на две точки, скажем, на n точек, и как это называется? В статье упоминается прямое линейное преобразование, но я не уверен, что это то, что я ищу...
Обобщение метода «средней точки» для триангуляции на n точек
Ответы (2)
Да, есть обобщение на N точек. Я видел это в некоторых статьях:
П. А. Бердслей, А. Зиссерман и Д. В. Мюррей. Последовательное обновление проективной и аффинной структуры от движения. Междунар. Дж. Вычисл. Видение, 23(3): 235–259, июнь 1997 г.
Шрикумар Рамалингам, Суреш К. Лодха и Питер Штурм. Общая структура из движения. вычисл. Вис. Image Underst., 103 (3): 218–228, сентябрь 2006 г.
Вы также можете прочитать книгу (ссылка на вашу статью в Википедии)
Ричард Хартли и Эндрю Зиссерман (2003). Геометрия множественного просмотра в компьютерном зрении. Издательство Кембриджского университета. ISBN 978-0-521-54051-3.
Но он не упоминает среднюю точку для N просмотров, насколько я помню, только для двух просмотров, в то время как этот метод изображен как неточный (не совсем мое мышление).
Я надеюсь, что это будет полезно.
Как предложил Fleurmond, обобщение триангуляции средней точки на n-представления дано в:
Шрикумар Рамалингам, Суреш К. Лодха и Питер Штурм. Общая структура из движения. вычисл. Вис. Image Underst., 103(3): 218–228, сентябрь 2006 г.
Вот пример кода на 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))