【问题标题】:Inverse 3D (triangle) projection逆 3D(三角形)投影
【发布时间】:2009-07-02 11:41:54
【问题描述】:

我有一个似乎无法解决的 3D 数学问题。

我有 3 个点的数据。数据是平面上的(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 中的相同。这意味着 point1 和 point2 之间的距离将是 sqrt((x1-x2)^2+(y1-y2)^2)。

我也随时知道线路(line1 和 line2)之间的距离。即 sqrt((line1x-line2x)^2+(line1y-line2y)^2+(line1z-line2z)^2)。

但是,我真的不知道从这里怎么走……甚至不知道这是否是正确的路线。

.

我希望你明白我想要做什么,并且你能帮助我。

提前致谢!

【问题讨论】:

  • 你是说你得到了三个点 (xn,yn),它们在点 (pxn, pyn) 处投影到平面上 - 你想弄清楚如何映射一个新点 (x4 , y4) 上飞机?
  • 是的,goodgai,这就是我要说的。但是,当我在我的问题中使用“平面”一词时,我指的是 (xn,yn) 点所在的平面(我认为这在尝试绘制第四个点时很重要)。很抱歉造成混乱。
  • 您在平面 (xn,yn) 上有三个点,它们被投影到投影平面 (pxn,pyn) 上。这也是一个中心(透视)投影,因此所有点都通过来自单个点的光线进行投影。你想知道如何反转投影:也就是说,如果给你一个投影点 (px4,py4) 如何得到 (x4,y4)?我没有得到的是你的原始点没有任何 z 坐标。为什么它们只有 x/y - 你知道 z 坐标还是这些 x/y 坐标在飞机自己的坐标系内......?
  • "我也知道 3D 中点之间的距离。这和 2D 中的一样。" --> 吓到我了,你怎么知道的?
  • @goodgai (xn,yn) 坐标确实是平面自身坐标系上的坐标。我得到 (x4,y4),我想产生 (px4,py4)。

标签: math 3d projection reverseprojection


【解决方案1】:

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

由于我们在这里处理的是平面,所以投影函数如下所示:

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

使用它,我们可以制作 2 个方程组来求解。

第一个
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)

注意:我使用this tool 解方程组。

【讨论】:

  • 哇,感谢您的广泛回答,但是,我认为这个解决方案有点阴暗,因为您使用的方法与投影并不真正相关。例如,没有眼睛。因此,我怀疑它是否能正常工作......不过我肯定会试一试。我会让你知道它是否有效。谢谢!
  • 这个解决方案不会给你一个眼睛或任何关于原始三角形平面的信息,但它应该可以解决你的问题。
【解决方案2】:

您应该使用homographic functionshomogeneous coordinates,它们通常用于3D 透视操作。

【讨论】:

  • 我会调查的。谢谢!
【解决方案3】:

(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),则其投影在投影基中具有相同的齐次坐标。

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

【讨论】:

  • 这听起来可能是真的……但是我如何确定 A1、A2 和 A3?谢谢!
  • 我不明白你怎么能在没有眼睛的情况下解决这个问题......眼睛的位置会改变投影,不是吗?
  • 如果你将自己置于初始平面的坐标系中,那么你就失去了投影平面。我认为这不是那么容易解决的。
  • @Scorpi0 请阅读我对我的问题的评论。我认为它应该澄清一些事情(一点)。
【解决方案4】:

我真的不明白这个问题?您是否试图在 3d 空间中定位一个您知道位于平面(例如墙壁或地板)上的对象,并且您唯一的输入是 3 个点(其中您知道 3d 空间中的距离)相机图像?

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

cameraCoordinates = world*view*projection*localCoordinates

这将产生一个方程系统,其中包含 6 个未知数(3d 中的旋转和位置)和 6 个方程(每个点 2 个)。然而,它将是非线性的,因此您必须使用数值方法来解决它。试试 Newton Rapson 方法。

【讨论】:

    【解决方案5】:

    这里“有点”晚了,但评分最高的答案没有考虑问题的 3D 空间。我们有一个透视投影问题,平面上的三个点(实际上是任何 3 个 3D 点)被投影到相机表面(如投影几何)。

    不可能给出一个明确的解决方案来解决这个问题(存在多种解决方案)。在给定 3 个 3D 点及其各自的 2D 透视投影的情况下,寻找相机位置和姿势的一般问题可以使用原始RANSAC paper 中的 P3P(Perspective-3-Point)算法来解决,该算法最多提供四种可能的可行解决方案(与相机前面的点)。

    给定一个相机位姿,计算额外平面点的投影是很简单的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-27
      • 1970-01-01
      • 2017-03-30
      • 1970-01-01
      • 2018-07-23
      • 2013-02-17
      • 1970-01-01
      • 2014-06-09
      相关资源
      最近更新 更多