Python如何合并重叠矩形框
发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,小编给大家分享一下Python如何合并重叠矩形框,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!需求:NMS中的IOU相关,是选择一个最大或者可信度最高的框框保留。而我们现在试需要将重
千家信息网最后更新 2025年02月01日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安全错误
数据库的锁怎样保障安全
四川大学图书馆服务器名称
perl数据库
辽宁统一软件开发价格优惠
我的世界琉璃日月服务器极巨汤
软件开发人才外包原因
浪潮查看服务器硬盘状态
在数据库中范围限制符包括
深圳2017软件开发
轻云服务器和阿里云
switch波兰什么服务器
政府单位数据库
生物信息学用什么配置服务器
联想服务器盒装配件售后
数据库发现趋势
编程软件开发的认识
数据库中实体的概念
上海交通大学软件开发
监控云服务器不能登陆
win10怎么新建数据库
3g网络安全
国内移动网络安全公司
遗传病数据库
软件开发辅助工作
网络技术云计算的文案
万能网络安全钥匙下载
动力学软件开发工具
我的世界服务器游戏加载慢
数据库中实体的概念
网站服务器如何数据库
西安筑波网络技术有限公司