如何获得具有左上角和右下角坐标的右上角框?
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'
【讨论】:
你太棒了。有用!非常感谢!以上是关于如何获得具有左上角和右下角坐标的右上角框?的主要内容,如果未能解决你的问题,请参考以下文章