代码之家  ›  专栏  ›  技术社区  ›  Pieter Jongsma

逆三维(三角形)投影

  •  5
  • Pieter Jongsma  · 技术社区  · 17 年前

    我有一道三维数学题,我好像解不出来。

    我有三点的数据。数据是平面上的(二维)坐标,漂浮在三维空间的某个地方。我也知道投影的(二维)坐标。这将产生以下数据数组:

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

    其中,法向(x1等)坐标表示平面上的坐标,另一个(px1等)表示投影坐标。

    我想做的是a项目 新的 二维坐标([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)。

    但是,我真的不知道怎么从这里走。。。或者这是不是正确的路线。

    .

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

    提前谢谢!

    5 回复  |  直到 15 年前
        1
  •  2
  •   Juozas Kontvainis    17 年前

    有一个函数投影,它可以变换点,使投影([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];
    

    利用它我们可以得到两个方程组来求解。

    第一个
    x1个* 斧头 +一* bx公司 + 国泰 =像素1
    x2个* +y2年* bx公司 + 国泰 =像素2
    x3个* 斧头 +y3年* bx公司 + 国泰 =像素3

    解决 斧头 , bx公司 国泰 给了我们

    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个* +一* 通过 + =py1
    x2个* +y2年* 通过 + =py2年
    x3个* +y3年* 通过 + =py3年

    解决 , 通过 给了我们

    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
  •  1
  •   fa.    17 年前

    你应该用 homographic functions homogeneous coordinates ,通常用于三维透视操作。

        3
  •  1
  •   Eric Bainville    17 年前

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

    第三次编辑。

    三维平面与投影平面的对应关系是一种投影变换。它可以定义为一个3x3矩阵T,在输入平面(x,y,1)(在坐标系中)的齐次坐标上操作,并在投影平面上生成坐标(u,v,T)。则px=u/t,py=v/t。

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

    一个小时前我似乎很清楚,但现在我开始怀疑:也许需要知道另外一对点,才能找到解决问题的唯一办法。。。如果你能找到它,可以看看J.G.Semple和G.T.Kneebone的《代数射影几何》一书。

        4
  •  0
  •   eman eman    17 年前

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

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

    cameraCoordinates = world*view*projection*localCoordinates
    

    这将产生一个方程系统,其中有6个未知(三维中的旋转和位置)和6个方程(每个点2个)。但是它是非线性的,所以你必须用数值方法来求解它。试试Newton-Rapson方法。

        5
  •  0
  •   digitalvision    13 年前

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

    不可能对这个问题给出明确的解决方案(存在多个解决方案)。在原算法的基础上,利用P3P(perspective-3-Point)算法,解决了在给定3个3D点及其各自的2D透视投影下寻找摄像机位置和姿态的一般问题 RANSAC paper ,这将给出四个可能的可行解决方案(点位于相机前面)。

    给定一个摄像机姿态,计算附加平面点的投影是很简单的。