我在2D空间中有两个点:
(255.62746737327373, 257.61185343423432)
(247.86430198019812, 450.74937623762395)
使用matplotlib
在png上绘图我得到了这个结果:
现在我想计算这两点之间的实际距离(以米为单位)。我知道该图像的真实尺寸为125米x 86米。 我怎么能以某种方式做到这一点?
答案 0 :(得分:1)
设ImageDim
为x和y坐标中图像的长度。
在这种情况下,它将是ImageDim = (700, 500)
,并让StadionDim
是体育场的长度。 StadionDim = (125, 86)
因此,计算图像中体育场中点的功能将是:
def calc(ImageDim, StadionDim, Point):
return (Point[0] * StadionDim[0]/ImageDim[0], Point[1] * StadionDim[1]/ImageDim[1])
所以现在你会在体育场得到两分。计算距离:
Point_one = calc((700,500), (125,86), (257, 255))
Point_two = calc((700,500), (125,86), (450, 247))
Distance = sqrt((Point_one[0]-Point_two[0])**2 + (Point_one[1]-Point_two[1])**2)
答案 1 :(得分:0)
我相信您的输入坐标位于世界空间中。但是当您在没有任何缩放的情况下绘制图像时,您将在图像空间中具有从左下角的(0,0)到右侧到角落的(image_width,image_height)的绘图坐标。因此,要将您的点正确地绘制到图像,需要将它们转换为图像空间,反之亦然,当需要进行任何真实世界空间计算时。我想你不会想要计算足球速度,以每秒像素为单位,但以秒为单位。
那么为什么不在世界坐标中绘制图像以避免两个空间坐标转换的痛苦?您可以在matplotlib中轻松完成。使用extent
参数。
范围:标量(左,右,下,上),可选,默认:无
数据坐标中左下角和右上角的位置。如果为None,则定位图像使得像素中心落在从零开始(行,列)的索引上。
例如这样:
imshow(imade_data, origin='upper',extent=[0, 0, field_width, field_height]);
然后你可以用世界坐标在图像上绘制你的点。距离计算也将变得清晰:
import math;
dx = x2-x1;
dy = y2-y1;
distance = math.sqrt(dx*dx+dy*dy);