【问题标题】:How to combine bounding boxes in OpenCV (Python)如何在 OpenCV(Python)中组合边界框
【发布时间】:2020-09-23 01:03:00
【问题描述】:

您好,我有一个矩形数组rect,它们表示检测到的对象的边界框。通常,这些矩形重叠,我想将所有相交的矩形合并成一个大矩形(例如,如果有两个单独的集群,屏幕上有多个矩形)。有没有办法做到这一点?

我已经尝试过cv2.groupRectangles(rect, 1, .5),但是矩形簇在中间被组合成一个与原始矩形大小相同的矩形。

编辑:

这是没有分组的图片:

这是带有分组的图片和下面描述的方法

为了更清楚地说明我在寻找什么,我只希望在单个块上使用红色框(或者理想情况下在整行上放置一个框),而不是在中间,这样可以压缩框的数量我需要进行计算以加快程序速度

【问题讨论】:

    标签: python opencv


    【解决方案1】:

    您将遍历分组的矩形并使用源矩形检查它们,并在它们相交时重写它们的边界(参见flag):

    def get_intersection_area(box_a, box_b):
        x_a = max(box_a[0], box_b[0])
        y_a = max(box_a[1], box_b[1])
        x_b = min(box_a[2], box_b[2])
        y_b = min(box_a[3], box_b[3])
        return max(0, x_b - x_a) * max(0, y_b - y_a)
    
    
    groupped = cv2.groupRectangles(rect, 1, 0.5)[0]
    groupped = [(x, y, x+w, y+h) for x, y, w, h in groupped]
    rect = [(x, y, x+w, y+h) for x, y, w, h in rect]
    flag = True
    while flag:
        flag = False
        for i in range(len(groupped)):
            for r in rect:
                if 0 < get_intersection_area(groupped[i], r) <\
                        (r[2]-r[0])*(r[3]-r[1]):
                    groupped[i] = (
                        min(groupped[i][0], r[0]), min(groupped[i][1], r[1]),
                        max(groupped[i][2], r[2]), max(groupped[i][3], r[3]),)
                    flag = True
    

    (我已将盒子从 tlwh 格式转换为 tlrb,因为它对我来说更方便)

    这是它现在给出的:

    要保留不相交的矩形,请不要使用cv2.groupRectangles()
    只需说groupped = np.copy(rect),尽管这样可能会做额外的工作并且需要进行一些优化。

    【讨论】:

    • 您好,感谢您的回复。我不确定我是否做错了什么,但它似乎并没有真正改变任何东西,而不仅仅是调用 group 参数。就我而言,我将用一张矩形的照片(没有分组和你的方法)的样子来更新我的问题,并用一张照片来更新我的问题
    • @JaredCohen,我的错,我混淆了盒子坐标格式 %) 我已经更新了答案。
    【解决方案2】:

    一种简单的方法是绘制填充在蒙版上的所有矩形。然后对该蒙版执行 findContours 以查找组合形状。要使结果为正方形,您可以使用 boundingRect 来查找 x、y、宽度和高度。请注意,这完全结合了所有矩形,而不仅仅是重叠部分。

    您可以找到合并矩形的示例代码示例here

    【讨论】:

      猜你喜欢
      • 2021-10-20
      • 2022-06-29
      • 1970-01-01
      • 2019-08-17
      • 2013-01-21
      • 2021-11-26
      • 2020-07-07
      • 2022-11-30
      • 1970-01-01
      相关资源
      最近更新 更多