python - 分组和排序框(坐标的ndarray)
问题描述
我有一个多维 numpy 数组,其中包含代表一个框的四个点(坐标):
[startX,startY], [endX,startY], [endX,endY], [startX, endY]
一个例子:
[[[298. 404. ]
[354. 404. ]
[354. 430. ]
[298. 430. ]]
[[358. 404. ]
[416. 404. ]
[416. 428. ]
[358. 428. ]]
[[136. 406. ]
[190. 406. ]
[190. 428. ]
[136. 428. ]]
[[194. 406. ]
[246. 406. ]
[246. 430. ]
[194. 430. ]]
[[422.49792 403.28558]
[505.2563 408.01465]
[503.85352 432.56305]
[421.09515 427.83398]]
[[246.68146 410.22128]
[291.68146 407.22128]
[293.1947 429.92038]
[248.1947 432.92038]]
[[234. 436. ]
[296. 436. ]
[296. 460. ]
[234. 460. ]]
[[298. 436. ]
[342. 436. ]
[342. 462. ]
[298. 462. ]]
[[343.37756 438.08197]
[455.64294 434.57367]
[456.55414 463.73267]
[344.28876 467.24097]]
[[186. 440. ]
[230. 440. ]
[230. 464. ]
[186. 464. ]]]
由于每个框都代表图像中单词的位置,因此我想以读取它们的方式对这些框进行排序。从左上角开始,从右下角结束。我正在考虑按它们的 startY 值对盒子进行排序:
box_group = box_group[np.argsort(box_group[:, 0, 1])]
这工作正常。现在我必须将与另一个高度重叠的每个框分组为一行。我检查这个:
def isOnSameLine(boxOne, boxTwo):
boxOneStartY = boxOne[0,1]
boxOneEndY = boxOne[2,1]
boxTwoStartY = boxTwo[0,1]
boxTwoEndY = boxTwo[2,1]
if((boxTwoStartY < boxOneEndY and boxTwoStartY > boxOneStartY)
or(boxTwoEndY < boxOneEndY and boxTwoEndY > boxOneStartY)):
return True
else:
return False
将分组框放在一行上,我可以按它们的 startX 值对它们进行排序,并且应该这样做。但我不知道如何迭代所有框并将它们分组/排序。有任何想法吗?
解决方案
听起来 lexsort 可能就是您所需要的(也许 x/y 颠倒了):
startY = boxes[:, 0, 1]
startX = boxes[:, 0, 0]
order = np.lexsort([startY, startX])
推荐阅读
- python - 在pyqt5中动态更改数据破折号
- javascript - 使用 ApiService 将 redux 工具包方法 createAsyncThunk 与 Angular HttpClient 集成
- php - Symfony 路由主机正则表达式
- linux - 使用 containerd 为容器创建同级进程
- firebase - 想要在flutter中通过底部导航栏的总价
- database - 如何从 laravel 中的用户的数据透视表中获取角色名称?
- javascript - 如何从 Keycloak 授权服务策略中请求的资源 URI 中获取路径参数?
- serialization - avro-rs 解释 `uuid` 给出 SerdeError
- java - 致命异常:java.lang.IndexOutOfBoundsException setSpan (4 ... 4) Android Studio
- flutter - 如何在 Flutter/Dart 中测试多个列表项的顺序?