逆3D(三角形)投影

时间:2009-07-02 11:41:54

标签: math 3d projection reverseprojection

我有一个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]]

我不能对飞机上的坐标做同样的事情,因为我对那架飞机一无所知。

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

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

我也知道3D点之间的距离。这跟二维相同。这意味着point1和point2之间的距离为sqrt((x1-x2)^ 2 +(y1-y2)^ 2)。

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

但是,我真的不知道如何从这里开始......或者甚至是否这是正确的选择。

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

提前致谢!

5 个答案:

答案 0 :(得分:2)

有一个函数Projection,可以变换点,使投影([x1,y1])= [px1,py1],投影([x2,y2])= [px2,py2],投影([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

解决 ax bx cx 给我们

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

解决 ay cy 给我们

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来解决方程式系统。

答案 1 :(得分: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).

第1次编辑。

(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)是由三角形顶点形成的基础中的齐次坐标。

第3次编辑。

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

如果一个点在由输入平面的三个点(不在同一条线上)形成的基础上具有齐次坐标(A1,A2,A3),那么它的投影在投影基础上具有相同的齐次坐标。

1小时前对我来说似乎很清楚,但现在我开始怀疑:可能需要另外一对点来解决这个问题...如果你能找到它,那么看看JG的“代数投射几何”一书Semple和G.T. Kneebone。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

我真的不明白这个问题?您是否尝试在三维空间中找到一个物体,您知道该物体位于一个平面上(例如墙壁或地板),而您唯一的输入是3点(其中您知道三维空间之间的距离)来自相机图像?

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

cameraCoordinates = world*view*projection*localCoordinates

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

答案 4 :(得分:0)

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

无法对此问题给出明确的解决方案(存在多种解决方案)。使用原始RANSAC paper中的P3P(Perspective-3-Point)算法可以解决给定3个3D点及其各自的2D透视投影的相机位置和姿势的一般问题,这给出了四个可能的可行性解决方案(在相机前面有点)。

考虑到相机姿势,计算附加平面点的投影是微不足道的。