三维逆向(三角形)投影

5

我有一个3D数学问题,但是我就是无法解决。

我有三个点的数据。这些数据是平面上的(2D)坐标,在3D空间中浮动。我还知道投影的(2D)坐标。这导致以下数据数组:

[[[x1,y1], [px1,py1],
 [[x2,y2], [px2,py2],
 [[x3,y3], [px3,py3]]

普通坐标(如x1等)表示平面上的坐标,其他坐标(如px1等)表示投影坐标。

我想做的是将一个新的2D坐标([x4,y4])投影出来。

.

我尝试过的方法:

当然,你需要有投影的眼光,所以我把它设置为[xe,ye,-1]。xe和ye是已知的。(这是照片参考,所以我只是把眼睛放在照片的中心。)

在眼睛下面,我放置了投影表面(z=0)。这给出了以下投影坐标:

[[[x1,y1], [px1,py1,0],
 [[x2,y2], [px2,py2,0],
 [[x3,y3], [px3,py3,0]]

我无法对平面上的坐标进行同样的操作,因为我对该平面一无所知。

我还想到可以制作从眼睛穿过投影坐标的线的参数化公式。对于线1,它应该是:

line1x = xe+(px1-xe)*t1
line1y = ye+(py1-ye)*t1
line1z = -1+t1 // = -1+(0--1)*t1

我还知道3D点之间的距离。这与2D相同。这意味着点1和点2之间的距离将是sqrt((x1-x2)^2+(y1-y2)^2)。
我也知道任何时候线1和线2之间的距离。这是sqrt((line1x-line2x)^2+(line1y-line2y)^2+(line1z-line2z)^2)。
然而,我不太清楚该怎么做......甚至不确定这是否是正确的方法。
希望你能理解我想要做什么,并且你能帮助我。
提前感谢!

你的意思是给定三个点 (xn, yn),它们被投影到平面上成为点 (pxn, pyn) - 你想要计算如何将一个新点 (x4, y4) 映射到该平面上? - Joel Goodwin
你在平面上有三个点(xn,yn),它们被投影到投影平面(pxn,pyn)上。这也是一种中心(透视)投影,因此所有点都是通过从单个点发出的光线进行投影的。你想知道如何反向投影:也就是说,如果给定一个投影点(px4,py4),如何得到(x4,y4)?我不明白的是,你的原始点根本没有任何z坐标。为什么它们只有x/y - 你知道z坐标吗,还是这些x/y坐标在平面自己的坐标系内...? - Joel Goodwin
“我也知道在三维空间中两点之间的距离,这与二维空间是相同的。” --> “这让我很震惊,你是怎么知道的?” - Cyril Gandon
@goodgai (xn,yn)坐标确实是飞机自身坐标系上的坐标。当我得到(x4,y4)时,我想要生成(px4,py4)。 - Pieter Jongsma
你可能想尝试使用像Cabri 3D这样的软件,网址是http://www.cabri.com/。 - Eric Bainville
显示剩余5条评论
5个回答

2

有一个名为Projection的函数,它可以将点转换为Projection([x1, y1]) = [px1, py1],Projection([x2, y2]) = [px2, py2],Projection([x3, y3]) = [px3, py3]。如果我理解正确,作者想知道如何找到这个Projection函数,以便他可以将[x4,y4]转换为[px4,py4]。

由于我们在处理平面,因此Projection函数如下:

Proj([ix, iy]) :
    return [ax*ix + bx*iy + cx,
            ay*iy + by*iy + cy];

使用这个方法,我们可以建立两个方程组来解决问题。
第一个方程组: x1 * ax + y1 * bx + cx = px1 x2 * ax + y2 * bx + cx = px2 x3 * ax + y3 * bx + cx = px3
解出axbxcx的值。
ax = (px1 * (y3 - y2) - px2*y3 + px3*y2 + (px2 - px3) * y1) /
     (x1 * (y3 - y2) - x2*y3 + x3*y2 + (x2 - x3) * y1)
bx = - (px1 * (x3 - x2) - px2*x3 + px3*x2 + (px2 - px3) * x1) /
     (x1 * (y3 - y2) - x2*y3 + x3*y2 + (x2 - x3) * y1)
cx = (px1 * (x3*y2 - x2*y3) + x1 * (px2*y3 - px3*y2) + (px3*x2 - px2*x3) * y1) /
     (x1 * (y3 - y2) - x2*y3 + x3*y2 + (x2 - x3) * y1)

第二个方程组如下: x1 * ay + y1 * by + cy = py1
x2 * ay + y2 * by + cy = py2
x3 * ay + y3 * by + cy = py3

解出aybycy,得到:

ay = (py1 * (y3 - y2) - py2*y3 + py3*y2 + (py2 - py3) * y1) /
     (x1 * (y3 - y2) - x2*y3 + x3*y2 + (x2 - x3) * y1)
by = - (py1 * (x3 - x2) - py2*x3 + py3*x2 + (py2 - py3) * x1) /
     (x1 * (y3 - y2) - x2*y3 + x3*y2 + (x2 - x3) * y1)
cy = (py1 * (x3*y2 - x2*y3) + x1 * (py2*y3 - py3*y2) + (py3*x2 - py2*x3) * y1) /
     (x1 * (y3 - y2) - x2*y3 + x3*y2 + (x2 - x3) * y1)

注意:我使用了这个工具来解决方程组问题。

哇,感谢您详尽的回答,但是我认为这个解决方案有点靠不住,因为您使用的方法与投影并没有真正的关系。例如,没有眼睛。因此,我怀疑它是否能正常工作...尽管如此,我一定会尝试一下。我会告诉您它是否有效。谢谢! - Pieter Jongsma
这个解决方案不会给你任何有关原三角形平面的信息,但它应该可以解决你的问题。 - Juozas Kontvainis

1

(x4,y4,1) = A1*(x1,y1,1) + A2*(x2,y2,1) + A3*(x3,y3,1),

解决A1、A2、A3的问题。然后

(xp4,yp4) = A1*(px1,py1) + A2*(px2,py2) + A3*(px3,py3).

第一次编辑。

(A1,A2,A3)是线性系统Mat *(A1,A2,A3)=(x4,y4,1)的解。

      ( x1  x2  x3 )
Mat = ( y1  y2  y3 )
      (  1   1   1 )

这个问题可以用多种方法解决。例如使用Cramer's规则。

第二次编辑。

我插入的1不是Z坐标,而是输入坐标的齐次扩展(必须是欧几里得坐标)。 (A1,A2,A3)是由三角形顶点形成的基础上的齐次坐标。

第三次编辑。

3D平面和投影平面之间的对应关系是一个射影变换。它可以定义为在输入平面中操作齐次坐标的3x3矩阵T(x,y,1)(在您的坐标系中),并在投影平面中产生坐标(u,v,t)。然后px = u / t,py = v / t。

如果一个点在输入平面的三个点(不在同一条直线上)的基础上具有齐次坐标(A1,A2,A3),则其投影在投影基础上具有相同的齐次坐标。

一个小时前,这对我来说似乎非常清楚,但现在我开始怀疑:也许需要知道额外一对点才能有问题的单一解决方案......如果你能找到它,请看一下J.G.Semple和G.T.Kneebone的书《代数投影几何》。


那听起来可能是真的...但是我如何确定A1、A2和A3呢? - Pieter Jongsma
我不明白你怎么能在没有眼睛的情况下解决这个问题...眼睛的位置会改变投影,不是吗? - Pieter Jongsma
如果您将自己放置在初始平面的坐标系中,那么您就会失去投影平面。我认为这并不容易解决。 - Cyril Gandon
1
@Scorpi0请阅读我在我的问题上发表的评论,我认为这会澄清事情(有点)。 - Pieter Jongsma

1

0

我不太明白问题所在?您是想在三维空间中定位一个已知位于平面上(例如墙壁或地板)的对象,而您唯一拥有的输入是来自相机图像的3个点(您知道它们在三维空间中的距离)吗?

在这种情况下,您将有3个方程式,其中localCoordinates是对象空间中的点坐标(给出了点之间已知的距离),而world是对象在三维空间中的位置。

cameraCoordinates = world*view*projection*localCoordinates

这将产生一个包含6个未知数(在3D中的旋转和位置)和6个方程式(每个点2个)的方程系统。然而,它将是非线性的,因此您必须使用数值方法来解决它。尝试使用牛顿-拉普森方法。


0
有点晚了,但是最高评分的答案没有考虑到问题的三维空间。我们面临的是透视投影问题,即在相机表面上(实际上是任意三个三维点)投影三个点(如投影几何学)。
对于这个问题,无法给出明确的解决方案(存在多个解决方案)。可以使用原始RANSAC paper中的P3P(Perspective-3-Point)算法解决给定3个三维点及其各自的2D透视投影的相机位置和姿态的一般问题,该算法提供最多四个可能的可行解(摆放在相机前面的点)。
给定相机姿态后,计算其他平面点的投影是微不足道的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接