python - 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。
解决方案
由于您已经在使用 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 倍。
它仍然是一个蛮力版本,可能对所有坐标进行许多不必要的计算。问题中没有给出圆圈,因此很难对它们进行推理。如果它们覆盖相对较小的区域,如果考虑较小的区域,问题将更快地解决(仍然是计算上的,而不是分析上的)。例如,代替测试所有坐标,可以使用圆的边界框的交点,这可以大大减少计算量。
推荐阅读
- angularjs - app.js:1 未捕获的 ReferenceError: 角度未在 app.js:1 中定义
- angular7 - Ionic 4 Reactive Forms 清除离子无线电组选择
- python - 使用输入字符串可以创建一个单词多少次?
- docker - 当我登录到 Docker Nexus 3 私有注册表时,我收到 404 错误
- android - 为什么我不能直接访问 let 作用域函数中使用的对象而不是 Kotlin 中的对象?
- dictionary - 如何为字典列表设置管道变量并将其传递给 groovy
- c# - 如何在单个事务中执行不同服务中的多个 EF Core 保存更改?
- android - 无法从 Firebase Cloud Function 中检索到的快照中遍历地图
- android - 单击图像时如何刷新 RecyclerView?
- python - cv2.polylines 可以返回形成线的每个点的坐标吗?