透视投影中的笛卡尔坐标系

时间:2013-05-26 22:00:24

标签: android-camera projection coordinate-systems perspectivecamera cartesian-coordinates

我仍然在为增强现实应用程序实现透视投影。我已经问过一些关于视口计算和其他相机内容的问题,这可以从this thread中的Aldream中解释

但是,我目前没有得到任何有用的值,我认为这取决于我对笛卡尔坐标空间的计算。

我有一些不同的方法将纬度,经度和海拔高度转换为笛卡尔坐标空间,但它们似乎没有任何正常工作。目前我正在使用ECEF(以地球为中心),但我也尝试了不同的计算,例如半正式公式和三角函数的组合(从距离和两点之间的方位计算x和y)。

所以我的问题是:

笛卡尔坐标空间如何影响我的透视投影?我在哪里“补偿”我的单位?(当我使用米或厘米时)?

假设我使用的是ECEF,而不是以米为单位的值,所以例如,我的相机位于(0,0,2米高),我的点位于(10,10,0)。现在我可以轻松地使用维基百科上提到的功能,然后使用我的其他线程(如上所述)中解释的dx,dy,dz的转换。我仍然没有得到:这个投影如何“知道”我的坐标系中的单位是什么?我认为这是我目前正在做的错误。我不处理我的坐标系的单位,因此,无法从我的投影中获得任何好的价值。

当我使用以厘米为单位的坐标系时,我的透视投影中的所有值都在增加。我在哪里“解决”这个单位问题?我是否必须将相机宽度和相机高度“转换”为像素到米?我是否必须将坐标系转换为像素?应该使用哪种坐标系来处理这种情况?我希望你能理解我的问题。

编辑:我自己解决了。 我已经将我的坐标系从ecef改为自己的系统(使用hasrsine和bearing,然后计算x,y,z),现在我得到了很好的价值! :)

1 个答案:

答案 0 :(得分:4)

我会尝试另一种方式来解释它。 :)

简短的回答是:笛卡尔位置的单位无关紧要,只要你保持同质,即,只要你将这个单位应用到你的场景和你的相机

对于更长的答案,让我们回到您使用的公式......

Projection to screen

使用:

  • d相对笛卡尔坐标
  • s可打印表面的大小
  • r“传感器”/录音表面的大小(即r_xr_y传感器的大小和r_z其焦距)
  • b您可打印面上的位置

..并进行伪维分析。我们有:

[PIXEL] = (([LENGTH] x [PIXEL]) / ([LENGTH] * [LENGTH])) * [LENGTH]

无论你使用LENGTH作为单位,它都会被同质化,即只保留比例。

例如:

[PIXEL] = (([MilliM] x [PIXEL]) / ([MilliMeter] * [MilliMeter])) * [MilliMeter]
        = (([Meter/1000] x [PIXEL]) / ([Meter/1000] * [Meter/1000])) * [Meter/1000]
        = 1000 * 1000 / 1000 /1000 * (([Meter] x [PIXEL]) / ([Meter] * [Meter])) * [Meter]
        = (([Meter] x [PIXEL]) / ([Meter] * [Meter])) * [Meter]

回到我对你的另一个主题的解释:

如果我们使用这些符号来表达b_x

b_x = (d_x * s_x) / (d_z * r_x) * r_z
    = (d_x * w) / (d_z * 2 * f * tan(α)) * f
    = (d_x * w) / (d_z * 2 * tan(α)) // with w in px

当您使用(d_x, d_y, d_z) = (X,Y,Z)(d_x, d_y, d_z) = (1000*X,1000*Y,1000*Z)时,比率d_x / d_z不会改变。


现在问题背后的原因,您应该检查是否将正确的装置应用到相机的位置/它到场景的距离。还要检查你的α或焦距单位,具体取决于你使用的那个。

如果认为后来的建议是最有可能的。很容易忘记将正确的单元应用于相机的特性。