2

我仍在为我的增强现实应用程序实现透视投影。我已经问过一些关于视口计算和其他相机东西的问题,这在这个线程中的 Aldream 中有解释

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

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

所以我的问题是:

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

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

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

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

4

1 回答 1

4

那我在这里尝试另一种方式来解释。:)

简短的回答是:你的笛卡尔位置的单位并不重要,只要你保持同质,即只要你把这个单位应用到你的场景和你的相机上。

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

投影到屏幕

和:

  • d相对笛卡尔坐标
  • s可打印表面的大小
  • r您的“传感器”/记录表面的大小(即传感器的大小r_x及其焦距)r_yr_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)or (d_x, d_y, d_z) = (1000*X,1000*Y,1000*Z),比率d_x / d_z都不会改变。


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

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

于 2013-05-28T13:10:18.087 回答