寻找多个重叠矩形的并集-OpenCV Python

Finding the union of multiple overlapping rectangles - OpenCV python(寻找多个重叠矩形的并集-OpenCV Python)
本文介绍了寻找多个重叠矩形的并集-OpenCV Python的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有几个重叠的边界框,它们围绕着单个对象,但它们在某些地方重叠得最少。作为一个整体,它们包含整个对象,但OpenCV的groupRecangles函数不会返回包含对象的长方体。我拥有的边框显示为蓝色,我希望退回的边框显示为红色

我希望只获得重叠矩形的并集,但不确定如何在不合并每个矩形的情况下遍历列表。 我有如下所示的并集和交集函数,以及由(X Y W H)表示的矩形列表,其中x和y是框的左上角的坐标。

def union(a,b):
  x = min(a[0], b[0])
  y = min(a[1], b[1])
  w = max(a[0]+a[2], b[0]+b[2]) - x
  h = max(a[1]+a[3], b[1]+b[3]) - y
  return (x, y, w, h)

def intersection(a,b):
  x = max(a[0], b[0])
  y = max(a[1], b[1])
  w = min(a[0]+a[2], b[0]+b[2]) - x
  h = min(a[1]+a[3], b[1]+b[3]) - y
  if w<0 or h<0: return () # or (0,0,0,0) ?
  return (x, y, w, h)

我的合并函数目前如下:

def combine_boxes(boxes):
    noIntersect = False
    while noIntersect == False and len(boxes) > 1:
        a = boxes[0]
        print a
        listBoxes = boxes[1:]
        print listBoxes
        index = 0
        for b in listBoxes:
            if intersection(a, b):
                newBox = union(a,b)
                listBoxes[index] = newBox
                boxes = listBoxes
                noIntersect = False
                index = index + 1
                break
            noIntersect = True
            index = index + 1

    print boxes
    return boxes.astype("int")

这基本上就是这样,如下所示

仍然有几个嵌套的边界框我不确定如何继续迭代。

推荐答案

我没有使用过OpenCV,所以对象可能需要更多的损坏,但可能需要使用迭代器。组合使combine_boxes函数更简单:

import itertools
import numpy as np
def combine_boxes(boxes):
    new_array = []
    for boxa, boxb in itertools.combinations(boxes, 2):
        if intersection(boxa, boxb):
            new_array.append(union(boxa, boxb))
        else:
            new_array.append(boxa)
    return np.array(new_array).astype('int')

编辑(您可能实际上需要zip)

for boxa, boxb in zip(boxes, boxes[1:])

一切都是一样的。

这篇关于寻找多个重叠矩形的并集-OpenCV Python的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Leetcode 234: Palindrome LinkedList(Leetcode 234:回文链接列表)
How do I read an Excel file directly from Dropbox#39;s API using pandas.read_excel()?(如何使用PANDAS.READ_EXCEL()直接从Dropbox的API读取Excel文件?)
subprocess.Popen tries to write to nonexistent pipe(子进程。打开尝试写入不存在的管道)
I want to realize Popen-code from Windows to Linux:(我想实现从Windows到Linux的POpen-code:)
Reading stdout from a subprocess in real time(实时读取子进程中的标准输出)
How to call type safely on a random file in Python?(如何在Python中安全地调用随机文件上的类型?)