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

Posted

技术标签:

【中文标题】如何获得具有左上角和右下角坐标的右上角框?【英文标题】:How can I get the top-right box having top-left and bottom-right coordinates? 【发布时间】:2021-10-30 06:58:32 【问题描述】:

让我们介绍一些上下文。我正在尝试为我的应用程序达到一些值,我需要获取 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”检测为一个,呵呵)

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

有什么办法吗?

感谢您的宝贵时间。

【问题讨论】:

嗨!非常有趣的问题。你知道周围盒子四个角的坐标吗? 如果包围盒的左下角称为A,包围盒的右上角称为B,那么点列表中“最右上角”的点P就是最大化的点P点积 AB.AP;或者,它是最小化距离 BP 的点 P。 不,这就是问题所在。如果我能得到它,我只需要计算单词的右上角和 top_right 点之间的距离。但生活总是想以错误的方式摩擦我们……哈哈哈 请提供足够的代码,以便其他人更好地理解或重现问题。 【参考方案1】:

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

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

前一种情况,调用B右上角的点,那么“最右上角”的点就是离右上角最近的点;这是P最小化欧几里得距离math.dist(B, 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'

【讨论】:

你太棒了。有用!非常感谢!

以上是关于如何获得具有左上角和右下角坐标的右上角框?的主要内容,如果未能解决你的问题,请参考以下文章

如何从左上角到右下角排列坐标?

如何从左下角到左上角更改pdf页面中文本的坐标

如何使用css将文本放在“框”的右上角或右下角

Anchor-free目标检测

如何在 UWP 中将画布的 x、y 坐标更改为右下角?

如何创建仅具有左上角和左下角半径的圆形 UIButton