将三角剖分的“中点”方法推广到 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))
在计算机视觉中,"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))