本文介绍了寻找多个重叠矩形的并集-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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!