当前位置: 首页 > 知识库问答 >
问题:

分组和排序框(坐标数组)

墨寂弦
2023-03-14

我有一个多维numpy数组,其中包含代表一个框的四个点(坐标):

[开始X,开始Y],[结束X,开始Y],[结尾X,结束Y],[开始X,结束Y]

一个例子:

[[[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.     ]]]

因为每个框都代表一个单词在图像中的位置,所以我想按照阅读的方式对这些框进行排序。从左上角开始,到右下角结束。我正在考虑按框的起始值排序:

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值对它们进行排序,应该这样做。但我不知道如何在遍历所有框的同时对它们进行分组/排序。有什么想法吗?

共有2个答案

梁丘柏
2023-03-14

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

startY = boxes[:, 0, 1]
startX = boxes[:, 0, 0]
order = np.lexsort([startY, startX])
彭宏深
2023-03-14

这就行了。

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)
    or(boxTwoEndY >= boxOneEndY and boxTwoStartY <= boxOneStartY)):
        return True
    else:
        return False

# list of indexes
temp = []
i = 0

# TODO: check if there is more than one box_group
while i < len(box_group):
    for j in range(i + 1, len(box_group)):
        if(isOnSameLine(box_group[i],box_group[j])):
            print(str(i) + " and " + str(j) + " on same line")
            if i not in temp:
                temp.append(i)
            if j not in temp:
                temp.append(j)
        else:
            print(str(i) + " and " + str(j) + " not on same line")
        # append temp with i if the current box (i) is not on the same line with any other box
        if len(temp) == 0:
            temp.append(i)

    # put boxes on same line into lined_box_group array
    lined_box_group = box_group[np.array(temp)]
    # sort boxes by startX value
    lined_box_group = lined_box_group[np.argsort(lined_box_group[:, 0, 0])]
    # copy sorted boxes on same line into sorted_box_group
    sorted_box_group[i:temp[-1]+1] = lined_box_group

    # skip to the index of the box that is not on the same line
    i = temp[-1] + 1
    # clear list of indexes
    temp = []
 类似资料:
  • 我有2列制表符分隔的整数,其中第一列是随机整数,第二列是标识组的整数,可以由此程序生成。() 然后,我使用第二个程序()计算每个组的和。 如果我在给定大小的数据集上运行这些程序,然后打乱相同数据集的行的顺序,打乱的数据计算总和的速度比有序数据快2倍或更多。 我本来希望按组排序的原始数据具有更好的数据局部性并且速度更快,但我观察到相反的行为。我想知道是否有人可以假设原因?

  • 给java类一些东西 我有一张物品清单 我希望能够对它们进行排序,这样它们就可以按照每个父对象的虚数的累积和排序,然后再按照虚数排序。 所以我最终 我知道用parentKey和sum of noThings映射它是 我想,也许包装我的Something类并获得每个父项的总密钥可能会在某种程度上起作用。 但看起来工作量很大,不太优雅。 如有任何意见/想法,将不胜感激。

  • 假设我有and数组[4,1,8,5]和另一个数组,它对应于第一个数组中的每个对象,比如[“四”,“一”,“八”,“五”]。如何在Swift中将第一个数组按升序排序,同时将第二个数组中的相应对象移动到相同的索引中?

  • 部分排序可以通过std::Partial_sort完成。 部分排序方式 5 7 4 2 8 6 1 9 0 3 在对3个元素进行部分排序之后 0 1 2 7 8 6 5 9 4 3 http://en.cppreference.com/w/cpp/algorithm/partial_sort. 但当某些元素已经排序时,这不是最好的。 还有其他这样的函数可以这样做并利用部分排序数组。

  • 问题内容: 我想按距离对TableView进行排序,但是我混淆了:(如果可以,请帮助我,我真的很感激:( 我有一个包含100个对象的数组。 等等..对不起,西里尔字母 并覆盖func tableView后,我有这个 我在这行有问题 使用未解决的标识符“ mall” 我该如何解决?以及如何按照指示进行排序?非常感谢。 问题答案: 使用未解决的标识符“ mall” =>在该函数的范围内没有任何名为 “

  • 本文向大家介绍PHP中数组的分组排序实例,包括了PHP中数组的分组排序实例的使用技巧和注意事项,需要的朋友参考一下 PHP的数组,数组中的内容大致如下: 为了方便表达,我把3列数字分别称为,ABC三列 需求:默认以A列排序为主,如果A列相同则以C列倒序排列相同的元素。B列其实没有参与排序,但是在实际运用中有用,所以我也写出来了。 方法一: 方法二: