【问题标题】:Determine if many points are in bounding box确定边界框中是否有很多点
【发布时间】:2020-09-25 20:03:39
【问题描述】:

数组x表示一个边界框,由两个(x,y)坐标分隔:

x = np.array([[2, 1], [5, 3]])

而数组p通过它们的(x,y)坐标表示点的集合:

p = np.array([[3, 2], [6, 4], [3, 4], [4, 2]])

对于p中的每个点,我想(在一次操作中)确定它是否在边界框x中,从而得到以下结果。

result = np.array([1, 0, 0, 1])

我虽然知道np.where(),但不确定如何在一次操作中处理整个点集合。另外,纯数值方法不是更快吗?

编辑:

我也对存在多个边界框的情况感兴趣,例如:

# [[bbox_1], [bbox_2], [bbox_2]]
# with each bbox as [x1 y1 x2 y2]
x = np.array([[2, 1, 5, 3], [2, 2, 4, 6], [0, 4, 3, 2]])

结果是表单

# [p1_bbox_1, p2_bbox_1, p3_bbox_1, p4_bbox_1], [p1_bbox_2, p2_bbox_2 ...]]
# results not necessarily exact but shape is correct
result = np.array([[True, False, False, True], [True, False, False, False], [False, False, True, False]])

应将恰好位于 bbox 边界上的点视为内部。

【问题讨论】:

  • 又被质疑了。来自p[2]p[3][3, 4][4, 2] 呢?他们不是在第二个盒子里吗?这是result的第二行。
  • 除了第一个边界框之外的值都是错误的——我只是做了这些例子,让我看看你是否希望我给出正确的值

标签: python numpy vector coordinates bounding-box


【解决方案1】:

通过切片和利用broadcasting -

In [24]: ((p>=x[0]) & (p<=x[1])).all(1)
Out[24]: array([ True, False, False,  True])

这假设边界框数组为:

[[x1,y1]
 [x2,y2]]

如果格式是定义盒子角的[x1,y1,x2,y2](一维数组),我们可以这样 -

((p>=x[:2]) & (p<=x[2:])).all(1)

此外,将&gt;= 编辑为&gt; 等以实现边界的排他性。

扩展到多个盒子

对于x中的多个盒子,格式为二维数组:

[[B1x1,B1y1,B1x2,B1y2],
 [B2x1,B2y1,B2x2,B2y2], ..
                      ]

所以,B1 是box-1B2box-2 等等,而(x1,y1)(x2,y2) 是每个框的边界框角。解决方案是 -

((p>=x[:,None,:2]) & (p<=x[:,None,2:])).all(2)

【讨论】:

  • 这真是太好了。当有多个边界框时怎么样,例如x = np.array([2, 1, 5, 3], [2, 2, 4, 6], [0, 4, 3, 2]]) — 仍然可以一次操作?
  • 在这种情况下,输出格式为result = np.array([[True, False, False, True], [False, True, False, False], [False, False, True, False]])
  • @Jivan x 有三行四列。那些是什么意思?一个 3x4 矩阵如何表示多个边界框?
  • 是的,由 4 个坐标组成的三个边界框 x1 y1 x2 y2 — 这只是一个示例,如果需要可以是不同的形状
  • @Jivan 你能把这些多个盒子的情况添加到问题中吗?另外,你说result[1,1] 是真的。这意味着[6,4][2, 2, 4, 6] 中,应该是False,对吧?
猜你喜欢
  • 2013-08-20
  • 2014-11-18
  • 1970-01-01
  • 2011-07-20
  • 1970-01-01
  • 2011-10-11
  • 1970-01-01
相关资源
最近更新 更多