如何获得具有左上角和右下角坐标的右上角框?
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'
让我们来介绍一下上下文。我正在尝试为我的应用程序达到一些值,我需要使用 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'