首页 > 解决方案 > python中的三边测量

问题描述

我正在研究定位系统。我的输入是一个字典,它将给我们从点(x1,y1)等半径为 d1 的圆。我想要的输出是一个数组(类似于 2D 坐标系),其中相交区域标记为 1,其余部分为 0。我试过这个:

xsize=3000
ysize=2000
lis={(x1,y1):d1,(x2,y2):d2,(x3,y3):d3}
array=np.zeros((xsize,ysize))
for i in range(xsize-1):
    for j in range(ysize-1):
        for element in lis:
            if distance((i,j),element)<=(lis[element]):
                array[i][j]=1
            else:
                array[i][j]=0
                break
def distance(p1,p2):
    return math.sqrt((p1[0]-p2[0])**2+(p1[1]-p2[1])**2)

唯一的问题是数组很大并且花费的时间太长(循环数为 1000 万),尤其是在树莓派上,否则这是可行的。有什么方法可以使用openCV和图像然后绘制圆圈以更快地获得相交区域?

它必须是 python 2.x。

标签: pythonpython-2.7opencvtrilateration

解决方案


由于您已经在使用 numpy,因此请尝试以矢量化方式重写您的操作,而不是使用循环。

# choose appropriate dtype for better perf
dtype = np.float32

# take all indices in an array
indices = np.indices((ysize, xsize), dtype=dtype).T
points = np.array(list(lis.keys()), dtype=dtype)

# squared distance from all indices to all points
dist = (indices[..., np.newaxis] - points.T) ** 2
dist = dist.sum(axis=-2)

# squared circle radii
dist_thresh = np.array(list(lis.values()), dtype=dtype) ** 2

intersect = np.all(dist <= dist_thresh, axis=-1)

这在我的机器上比 for 循环版本快大约 60 倍。

它仍然是一个蛮力版本,可能对所有坐标进行许多不必要的计算。问题中没有给出圆圈,因此很难对它们进行推理。如果它们覆盖相对较小的区域,如果考虑较小的区域,问题将更快地解决(仍然是计算上的,而不是分析上的)。例如,代替测试所有坐标,可以使用圆的边界框的交点,这可以大大减少计算量。


推荐阅读