首页 > 解决方案 > 分组和排序框(坐标的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 值对它们进行排序,并且应该这样做。但我不知道如何迭代所有框并将它们分组/排序。有任何想法吗?

标签: pythonarraysnumpysorting

解决方案


听起来 lexsort 可能就是您所需要的(也许 x/y 颠倒了):

startY = boxes[:, 0, 1]
startX = boxes[:, 0, 0]
order = np.lexsort([startY, startX])

推荐阅读