Python如何合并重叠矩形框
发表于:2025-11-14 作者:千家信息网编辑
千家信息网最后更新 2025年11月14日,小编给大家分享一下Python如何合并重叠矩形框,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!需求:NMS中的IOU相关,是选择一个最大或者可信度最高的框框保留。而我们现在试需要将重
千家信息网最后更新 2025年11月14日Python如何合并重叠矩形框
小编给大家分享一下Python如何合并重叠矩形框,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!
需求:
NMS中的IOU相关,是选择一个最大或者可信度最高的框框保留。
而我们现在试需要将重叠框框合并为一个大的框框,所以不能直接用上面的。
并且
OpenCV的groupRectangles在Python中我实在用不懂,而且它会把不重叠的框直接删了。。
原理:
循环+递归,依次判断两个框是否有重叠。
效果:

参考代码:
import cv2import numpy as npdef checkOverlap(boxa, boxb): x1, y1, w1, h2 = boxa x2, y2, w2, h3 = boxb if (x1 > x2 + w2): return 0 if (y1 > y2 + h3): return 0 if (x1 + w1 < x2): return 0 if (y1 + h2 < y2): return 0 colInt = abs(min(x1 + w1, x2 + w2) - max(x1, x2)) rowInt = abs(min(y1 + h2, y2 + h3) - max(y1, y2)) overlap_area = colInt * rowInt area1 = w1 * h2 area2 = w2 * h3 return overlap_area / (area1 + area2 - overlap_area)def unionBox(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 intersectionBox(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 () return [x, y, w, h]def rectMerge_sxf(rects: []): # rects => [[x1, y1, w1, h2], [x2, y2, w2, h3], ...] ''' 当通过connectedComponentsWithStats找到rects坐标时, 注意前2個坐标是表示整個圖的,需要去除,不然就只有一個大框, 在执行此函数前,可执行类似下面的操作。 rectList = sorted(rectList)[2:] ''' rectList = rects.copy() rectList.sort() new_array = [] complete = 1 # 要用while,不能forEach,因爲rectList內容會變 i = 0 while i < len(rectList): # 選後面的即可,前面的已經判斷過了,不需要重復操作 j = i + 1 succees_once = 0 while j < len(rectList): boxa = rectList[i] boxb = rectList[j] # 判斷是否有重疊,注意只針對水平+垂直情況,有角度旋轉的不行 if checkOverlap(boxa, boxb): # intersectionBox(boxa, boxb) complete = 0 # 將合並後的矩陣加入候選區 new_array.append(unionBox(boxa, boxb)) succees_once = 1 # 從原列表中刪除,因爲這兩個已經合並了,不刪除會導致重復計算 rectList.remove(boxa) rectList.remove(boxb) break j += 1 if succees_once: # 成功合並了一次,此時i不需要+1,因爲上面進行了remove(boxb)操作 continue i += 1 # 剩餘項是不重疊的,直接加進來即可 new_array.extend(rectList) # 0: 可能還有未合並的,遞歸調用; # 1: 本次沒有合並項,說明全部是分開的,可以結束退出 if complete == 0: complete, new_array = rectMerge_sxf(new_array) return complete, new_arraybox = [[20, 20, 20, 20], [100, 100, 100, 100], [60, 60, 50, 50], [50, 50, 50, 50]]_, res = rectMerge_sxf(box)print(res)print(box)img = np.ones([256, 256, 3], np.uint8)for x,y,w,h in box: img = cv2.rectangle(img, (x,y), (x+w,y+h), (0, 255, 0), 2)cv2.imshow('origin', img)img = np.ones([256, 256, 3], np.uint8)for x,y,w,h in res: img = cv2.rectangle(img, (x,y), (x+w,y+h), (0, 0, 255), 2)cv2.imshow('after', img)cv2.waitKey(0)看完了这篇文章,相信你对"Python如何合并重叠矩形框"有了一定的了解,如果想了解更多相关知识,欢迎关注行业资讯频道,感谢各位的阅读!
框框
面的
矩形
坐标
篇文章
不行
最大
最高
成功
两个
代码
函数
原理
只有
可信
可信度
完了
效果
更多
水平
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全考题
pgsql 异地数据库实时同步
软件开发经理关键绩效指标
如何购买服务器
达梦设置数据库表主键
莆田跑腿app软件开发多少钱
韵达软件开发工资待遇
数据库实体之间有什么联系
网络安全法 谣言
标注转注记数据库当前未知
公共广播内部服务器
沙湖网络技术
小学网络安全教育活动教案
软件开发 面试没问技术
软件开发课程海报创意
菏泽网络安全知识
lol未获取到服务器信息
网络安全管控软件
江西调度服务器品牌云主机
数据库一张表关联两张表
文献数据库的检索途径
曲靖软件开发招工
服务器gpu卡连续损坏
数据库应用领域的发展前景
迪斯杰数据库审计
1688网络技术有限公司
数据库原理与实践邢为民答案
麒麒操作系统应用软件开发
jvav软件开发好学吗
软件开发企业税收依据