如何获得具有左上角和右下角坐标的右上角框?

How can I get the top-right box having top-left and bottom-right coordinates?

让我们来介绍一下上下文。我正在尝试为我的应用程序达到一些值,我需要使用 img 的红色框。

我得到了这些词的所有 top_left 和 bottom_right 坐标。

[Word(top_left=(608, 11), bottom_right=(821, 38), confidence=99.45719909667969, text='PANELBOARD'), 
Word(top_left=(25, 12), bottom_right=(106, 39), confidence=99.0506591796875, text='CH1L'), 
Word(top_left=(112, 12), bottom_right=(282, 44), confidence=97.45893859863281, text='(EXISTING)'), 
Word(top_left=(1264, 39), bottom_right=(1346, 55), confidence=83.25164031982422, text='208Y/120V,'), 
Word(top_left=(1350, 39), bottom_right=(1410, 55), confidence=94.61625671386719, text='3PH,4W'), 
Word(top_left=(1379, 60), bottom_right=(1412, 75), confidence=98.55554962158203, text='MLO'), 
Word(top_left=(92, 61), bottom_right=(215, 75), confidence=99.64352416992188, text='REFRIGERATED'), 
Word(top_left=(219, 61), bottom_right=(262, 75), confidence=99.87834930419922, text='CASE'), 
Word(top_left=(265, 61), bottom_right=(318, 75), confidence=99.78636932373047, text='LIGHTS'), 
Word(top_left=(320, 61), bottom_right=(331, 75), confidence=99.71800231933594, text='&'), 
Word(top_left=(19, 61), bottom_right=(87, 76), confidence=99.207763671875, text='SERVES:'), 
Word(top_left=(334, 61), bottom_right=(402, 76), confidence=99.7181625366211, text='RECEPTS'), 
Word(top_left=(1335, 61), bottom_right=(1376, 76), confidence=98.63665771484375, text='250A,'), 
Word(top_left=(18, 83), bottom_right=(104, 97), confidence=98.90849304199219, text='LOCATION:'), 
Word(top_left=(108, 83), bottom_right=(155, 97), confidence=99.3512954711914, text='COMP'), 
Word(top_left=(157, 83), bottom_right=(211, 97), confidence=99.74064636230469, text='HOUSE'), 
Word(top_left=(214, 83), bottom_right=(221, 97), confidence=97.91343688964844, text='1'), 
Word(top_left=(1376, 103), bottom_right=(1408, 118), confidence=98.71705627441406, text='BUS'), 
Word(top_left=(18, 104), bottom_right=(110, 118), confidence=99.58409118652344, text='MOUNTING:'), 
Word(top_left=(112, 104), bottom_right=(183, 118), confidence=99.85911560058594, text='SURFACE'), 
Word(top_left=(1210, 104), bottom_right=(1304, 118), confidence=99.44200134277344, text='EQUIPMENT'), 
Word(top_left=(1307, 104), bottom_right=(1374, 118), confidence=99.8482666015625, text='GROUND')]

当“MLO”的 x 大于“3PH, 4W”时出现问题,因此按 x 排序然后按 y 排序不起作用(是的,OCR 将“3PH, 4W”检测为一个 hehe)

我尝试遵循“右上角的差异最小”的规则,但它也不起作用。

有什么解决办法吗?

感谢您的宝贵时间。

如果您知道这两个信息中的任何一个,这个问题就很容易回答:

  • 整体包围框的右上角坐标;
  • 整个包围盒的左下-右上对角线的方向向量。

前一种情况,调用B右上角的点,那么“最右上”的点就是离右上角最近的点;这是最小化欧氏距离 math.dist(B, P).

的点 P

后一种情况,称v为左下-右上对角线的方向向量,以O = (0,0)为原点,“最右上”点为P 最大化点积 v.OP(其中 OP 代表“向量 OP”并且与点 P 具有相同的坐标)。

你的问题没有给出右上角的坐标;然而,将对角线的方向向量近似为 v = (1, -1)v 和点 P = (x,y) 之间的点积只是 x-y;因此,您可以通过这种方式获得“最右上角”右上角的框:

>>> def toprightness(w):
...   return w.bottom_right[0] - w.top_left[1]
... 
>>> max(data, key=toprightness).text
'3PH,4W'