Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Math 将三维坐标投影到具有已知点的二维图像上_Math_Opengl_3d_Gis_Projection Matrix - Fatal编程技术网

Math 将三维坐标投影到具有已知点的二维图像上

Math 将三维坐标投影到具有已知点的二维图像上,math,opengl,3d,gis,projection-matrix,Math,Opengl,3d,Gis,Projection Matrix,我正在编写一个.NET程序,它允许用户通过识别图像上的特定点,然后指定与每个点关联的真实世界坐标来注册图像 图像注册过程还要求用户指定摄像机的坐标 我希望在图像注册后能够根据它们的真实坐标在图像上绘制其他点 我已经读了很多关于透视投影的书,但我很难让它正常工作。我必须承认,我的数学技能不是他们应该具备的,这是斗争的一部分。我被卡住的地方是试图确定焦距和到显示屏表面的距离: 本文中称为观察者的位置(e[x,y,z]): 我也提到了这篇文章: http://www.shotlink.com/Tou

我正在编写一个.NET程序,它允许用户通过识别图像上的特定点,然后指定与每个点关联的真实世界坐标来注册图像

图像注册过程还要求用户指定摄像机的坐标

我希望在图像注册后能够根据它们的真实坐标在图像上绘制其他点

我已经读了很多关于透视投影的书,但我很难让它正常工作。我必须承认,我的数学技能不是他们应该具备的,这是斗争的一部分。我被卡住的地方是试图确定焦距和到显示屏表面的距离:

本文中称为观察者的位置(e[x,y,z]):

我也提到了这篇文章: http://www.shotlink.com/Tour/WebTemplate/shotlinknew.nsf/2c47cc31e412bc4985256e6e00287832/c1743b40acf6aa03852575b7007122b0/$FILE/Plotting%203D%20ShotLink%20Data%20on%202D%20Images.pdf 它从视野中提取焦距,这似乎是事先知道的,但在我的例子中不是

所以我想我的问题是,有没有一种方法可以根据图像上已知点的位置反向确定焦距和/或视野?还是我看得不对,也许有更简单的方法来实现最终目标?


编辑:我被模式上的混合单元弄糊涂了。因此,我对我的答案做了一些修改


如果我们看看投影背后的数学,我觉得这是可行的

下面是一个不太严格的水平坐标的情况模式(我混合了真实世界的坐标和像素,试图说明您的情况):

与:

  • D
    ,用户给定的点之一,其投影位置相对于相机定义的相对坐标系(应用平移和旋转后)
  • E
    摄像机点-上述坐标系的原点
  • B
    图片平面中的结果点,以像素为单位显示
    u
    v
    。图片平面的尺寸为
    w
    x
    h
    像素
  • f
    焦距(与
    x
    y
    z
    …)以像素为单位,
    f
    其实际单位值,以及
    α
    水平半视角-您要计算的值

您可以看到三角形ECD和EBM相似,因此使用,我们得到:

  • EM/EC=MB/CD
    f/z=u/x
    (我们正在比较比率,因此,如果等式的左侧成员使用真实世界的单位,而右侧成员使用像素,则没有问题。真实世界的值除以像素1)
因此,我们得到:

  • f=u/x*z
现在,如果您想要
α
F
,我想您需要知道相机传感器的尺寸
r\u x
x
r\u y
,因为:

  • tan(α)=(r_x/2)/f
    f=r_x/(w/2)*f
但对于
α
,您可以通过以下方式获得:

  • tan(α)=(w/2)/f

如果您想与您指出的维基百科文章进行对比,我们一直在使用:

其中:

  • (d_x,d_y,d_z)
    =
    (x,y,z)
    ,点在相机系统中的位置
  • (sux,suy)
    =
    (w,h)
    ,可打印表面的大小
  • (r\ux,r\uy,r\uz)
    =
    (r\ux,r\uy,f)
    ,记录表面的特征
  • (b_x,b_y)
    =
    (u,v)
    ,在可打印表面上的位置

我使用Tsai算法()的实现解决了这个问题,该算法可以使用最少4个已知点计算投影矩阵。基本上,我允许用户指定点的世界坐标,然后单击图像以指定图像坐标。该算法使用这些映射(映射越多,解决方案越精确)以及图像宽度和高度来计算投影矩阵。然后可以使用此投影矩阵使用世界坐标将其他点投影到图像上。

感谢@AlStream的回复。我正在寻找一种解决方案,它也不需要用户知道相机传感器的尺寸。我对单位感到困惑,我编辑了我的答案。但是我不认为在没有传感器数据的情况下,你可以同时获得视角和焦距(至少在我推动数学的时候…)。