图像上两点之间的实际距离

Real distance between two points over image

我在 2D 中有两个点 space:

(255.62746737327373, 257.61185343423432)
(247.86430198019812, 450.74937623762395)

matplotlib 在 png 上绘制它们我得到了这个结果:

现在我想计算这两点之间的实际距离(以米为单位)。我知道该图像的实际尺寸是 125 米 x 86 米。 我怎样才能以某种方式做到这一点?

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)

我相信你输入的坐标在世界 space 中。但是当你在没有任何缩放的情况下绘制图像时,你将在图像 space 中从左下角的 (0,0) 到右下角的 (image_width, image_height) 绘制坐标.因此,要将您的点正确绘制为图像,需要将它们转换为图像 space,反之亦然,当需要完成任何现实世界 space 计算时。我想你不想计算让我们说足球速度以每秒像素为单位,但以米为单位。

那么为什么不在世界坐标中绘制图像以避免两个 space 坐标转换的痛苦呢?您可以在 matplotlib 中轻松完成。使用 extent 参数。

extent : scalars (left, right, bottom, top), optional, default: None

The location, in data-coordinates, of the lower-left and upper-right corners. If None, the image is positioned such that the pixel centers fall on zero-based (row, column) indices.

例如这样:

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);