从四边形坐标获取边界框坐标(xywh)并对其进行归一化

Posted

技术标签:

【中文标题】从四边形坐标获取边界框坐标(xywh)并对其进行归一化【英文标题】:Get bounding box coordinates (xywh) from quad coordinates and normalize them 【发布时间】:2021-12-25 15:45:58 【问题描述】:

我有照片和这些照片中对象的坐标。

例如:

        
          "shape_attributes": 
            "name": "polygon",
            "all_points_x": [613, 2007, 1769, 581],
            "all_points_y": [1767, 1674, 2260, 2395]
          ,
          "region_attributes": "field_name": "doc_quad"
        

我需要将它们转换为 4 个点:

 x_center y_center width height

得到一个边界框。之后,我需要按照以下说明对它们进行规范化:

Box coordinates must be in normalized xywh format (from 0 - 1). If your boxes are in pixels, divide x_center and width by image width, and y_center and height by image height.

如何将8个指向多边形坐标转换为规范化形式(4个点)?

这个问题可能需要一些几何知识,如果您觉得这个问题太简单,您可以发送相关文章的链接。问题是我不知道如何向 Google 提问以找到答案,因为 How to convert 8 point polygon coordinates into 4 point rectangle coordinates 没有给我想要的结果(我发现的大多数文章都假设我不知道实际坐标并使用了一些检测来自opencv 的函数,但我确实知道实际坐标)这就是我在这里问的原因。

【问题讨论】:

您的多边形不是“8 点”。它是四点的,每个点由两个值组成。你需要先try解决你的问题。请查看tour 和How to Ask,以提高获得体面答案的机会。 @ChristophRackwitz 我得到了下面的答案。我尝试首先解决问题并进行了谷歌搜索。我问是因为我自己无法弄清楚。有意义吗? 老实说,没有。在四个点周围放置一个框...您应该已经认识到您需要使用min()max(),而那个框的中心只是...这都是基本的数学。高中数学。无论如何,你得到了答案,你甚至得到了为你编写的代码,争论这个不会有任何结果。 @ChristophRackwitz 我同意这是一个非常简单的问题,但并不是这个世界上的每个人都像你一样拥有相同的知识。我无法理解这 8 个数字代表 4 个点而不是 8 个点。我没有要求 code ,而是要求一种解决问题的方法。我什至要求提供一些链接。现在我有了一个可视化,并理解这是一个简单的问题。 【参考方案1】:

由于多边形不是矩形,一种方法是采用一个覆盖内部所有点的边界框,或者一个被所有点覆盖的紧密矩形。下面是第一种方法。

"all_points_x": [613, 2007, 1769, 581]
"all_points_y": [1767, 1674, 2260, 2395]

虽然图形(0,0) 位于左下角,图像(0,0) 点从左上角开始,但想法是相同的。我的图表参考中只有顶部和底部的水平线被翻转为图像。

图表在这里,https://www.desmos.com/calculator/bzhbyrgz3o

all_points_x 的最大值得到最右边的垂直线,取all_points_x 的最小值得到最左边的垂直线。同样取all_points_y 的最大值和最小值得到顶部和底部水平线。

p2 = max([613,2007,1769,581]) = 2007
p1 = min([613,2007,1769,581]) = 581
q2 = max([1767,1674,2260,2395]) = 2395
q1 = min([1767,1674,2260,2395]) = 1674

通过(cx,cy)获取中心点,

cx = (p1 + p2) / 2 = 1294
cy = (q1 + q2) / 2 = 2034.5

获取宽度、高度、(w,h) by,

w = p2 - p1 = 1426
h = q2 - q1 = 721

现在如果图像是(im_w, im_h),那么标准化格式将是,

cx_new = cx / im_w
w_new = w / im_w
cy_new = cy / im_h 
h_new = h / im_h

所以这4个数字是,

cx_new cy_new w_new h_new 

这种格式x_center y_center width height被YOLO使用。 This link 应该会有所帮助。

【讨论】:

很好的答案,但请考虑您奖励的行为。你刚刚为他写了他的代码。 @ChristophRackwitz ffs。我不会使用 code !他解释了我想不通的事情。 “8 个数字 == 4 个点的坐标”,这就是我所需要的。【参考方案2】:

是否可以从中找到最小覆盖的矩形

--> min(x),min(y) max(x),max(y)

【讨论】:

能详细说明一下吗?我有 8 分,但你的方法需要 4 个参数

以上是关于从四边形坐标获取边界框坐标(xywh)并对其进行归一化的主要内容,如果未能解决你的问题,请参考以下文章

如何从 YOLOv5 预测中获取类和边界框坐标?

多边形和方形纹理的纹理坐标

从旋转的矩形计算边界框坐标

TensorFlow对象检测API教程中获取边界框坐标

从旋转的矩形计算边界框坐标

YOLO物体检测中如何获取边界框的坐标?