GPS转换-像素坐标到GPS坐标

3

我正在从视频数据中进行一些运动跟踪。通过一些视频处理(即转换为俯视图),我已经获得了一个运动路径。现在,我需要将路径的像素坐标(x,y)转换为世界坐标(纬度、经度)。

我在图像中有四个参考点及其对应的纬度和经度点。(纬度/经度->像素坐标):

(51.606733, -3.986813) -> (246, 399)
(51.607357, -3.987126) -> (407, 781)
(51.607337, -3.987266) -> (838, 781)
(51.606671, -3.987175) -> (1247, 402)

我该如何使用这些参考点将像素坐标转换为世界坐标呢?

你找到解决问题的方法了吗? - 08Dc91wk
1个回答

7

问题

将GPS投影到二维平面上通常是一个棘手的问题,因为地球表面是弯曲的,而不是平的。但是,如果您提供的样本GPS数据是实际数据(顺便问一下,Swansea的天气是否宜人!),我将假设该数据集仅限于一个非常小的区域,因此您可以假定经线是平行的。然后问题就变成了一个简单的代数问题,您只需要两个参考点,其中x1 != x2并且y1 != y2

解决方案

ISO坐标表示为(纬度,经度)=(y,x),而绘制的坐标表示为(x,y)。我将向您展示如何处理y(纬度)。我们需要将源(屏幕)的原点映射到目标(世界)的原点,并将源的比例映射到世界的比例。我将按以下方式命名这些变量:

screenY0 //Screen origin (pixel corresponding to zero degrees latitude)
worldY0 //World origin (zero degrees latitude)
screenYscale //Screen scale (distance between 2 pixels)
worldYscale //World scale (distance between two latitude lines)
screenYpoint //Screen point (pixel y location)
worldYpoint //World point (latitude on the ground)

我将使用以下坐标对,因为它们之间的距离最远:

(51.606733, -3.986813) -> (246, 399)
(51.607337, -3.987266) -> (838, 781)

我们的公式将会长成这个样子:

screenY0 + screenYscale * screenYpoint = worldY0 + worldYscale * worldYpoint.

我们知道世界的原点是0,世界的比例尺是1,因此我们可以简化为:
screenY0 + screenYscale * screenYpoint = worldYpoint.

我们可以将值代入,得到两个联立方程式: screenY0 + screenYscale * 399 = 51.606733screenY0 + screenYscale * 781 = 51.60733 解决方法如下: screenY0 = 51.606733 - screenYscale * 399screenY0 = 51.607337 - screenYscale * 781
=> 51.606733 - screenYscale * 399 = 51.607337 - screenYscale * 781 
=> screenYscale * 781 - screenYscale * 399 = 51.607337 - 51.606733
=> screenYscale * 382 = 0.000604
=> screenYscale = 0.00000158115

因此,您地图上的每个像素代表经度0.00000158115度。将其插入以找到起点:

   screenY0 + screenYscale * 399 = 51.606733 
=> screenY0 + 0.00000158115 * 399 = 51.606733 
=> screenY0 + 0.00063087885 = 51.606733
=> screenY0 = 51.606733 - 0.00063087885
=> screenY0 = 51.6061021212

因此,像素点0代表实际世界中的51.6061021212。

公式

我们用以下公式来找到真实世界的纬度:

51.6061021212 + 0.00000158115 * screenYpoint = worldYpoint。


测试

让我们用您提供的参考纬度测试一下:51.606671 -> 402。

51.6061021212 + 0.00000158115 * screenYpoint = worldYpoint
51.6061021212 + 0.00000158115 * 402 = 51.606671
51.6061021212 + 0.0006356223 = 51.606671
51.6067377435 = 51.606671

这是大致相等的;考虑到纬度1度等于111.2公里(以地球平均半径为基础),这相当于约7.4米的误差。
希望这能帮助你解决经度,也称为x的问题!如果您遇到任何问题或需要我澄清,请留言。

我发现这个答案非常棒,谢谢您。有没有什么技巧来处理方向?表示地图片段的图像被顺时针旋转了几度,因此坐标不匹配...提前感谢! - edwardffs
如果我理解正确,pixelY =(latitudeStart + 1 * latitudeInput)/(yStart + yScale)。谢谢您详细的回答。 - Joe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接