我在OpenCV中使用方法
triangulatePoints(P1,P2,X1,X2)
通过左/右图像中的图像点x1 / x2和投影矩阵P1 / P2获得点的3D坐标。
我已经研究过极线几何,并且知道其背后的大部分数学知识。但是这个算法在数学上如何得到3D坐标?
答案 0 :(得分:1)
据我所知,这里只是一些想法,至少应该在理论上起作用。
使用相机方程ax = PX
,我们可以将两个图像点对应表示为
ap = PX
bq = QX
其中p = [p1 p2 1]'
和q = [q1 q2 1]'
是匹配的图像指向3D点X = [X Y Z 1]'
和P
和Q
是两个投影矩阵。
我们可以扩展这两个方程并重新排列这些术语以形成Ax = b
系统,如下所示
p11.X + p12.Y + p13.Z - a.p1 + b.0 = -p14
p21.X + p22.Y + p23.Z - a.p2 + b.0 = -p24
p31.X + p32.Y + p33.Z - a.1 + b.0 = -p34
q11.X + q12.Y + q13.Z + a.0 - b.q1 = -q14
q21.X + q22.Y + q23.Z + a.0 - b.q2 = -q24
q31.X + q32.Y + q33.Z + a.0 - b.1 = -q34
我们得到
A = [p11 p12 p13 -p1 0; p21 p22 p23 -p2 0; p31 p32 p33 -1 0; q11 q12 q13 0 -q1; q21 q22 q23 0 -q2; q31 q32 q33 0 -1]
,x = [X Y Z a b]'
和b = -[p14 p24 p34 q14 q24 q34]'
。现在我们可以求解x来找到3D坐标。
另一种方法是使用相机方程ax = PX
中的事实,即x
和PX
是平行的。因此,他们的叉积必须是0
向量。所以使用,
p x PX = 0
q x QX = 0
我们可以构建一个Ax = 0
形式的系统并求解x。