您将遍历分组的矩形并使用源矩形检查它们,并在它们相交时重写它们的边界(参见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),尽管这样可能会做额外的工作并且需要进行一些优化。