Python合并重叠矩形框
作者:songxf 发布时间:2023-06-11 02:33:41
标签:Python,合并,重叠,矩形框
需求:
NMS中的IOU相关,是选择一个最大或者可信度最高的框框保留。
而我们现在试需要将重叠框框合并为一个大的框框,所以不能直接用上面的。
并且
OpenCV
的groupRectangles
在Python中我实在用不懂,而且它会把不重叠的框直接删了。。
原理:
循环+递归,依次判断两个框是否有重叠。
效果:
参考代码:
import cv2
import numpy as np
def checkOverlap(boxa, boxb):
x1, y1, w1, h1 = boxa
x2, y2, w2, h2 = boxb
if (x1 > x2 + w2):
return 0
if (y1 > y2 + h2):
return 0
if (x1 + w1 < x2):
return 0
if (y1 + h1 < y2):
return 0
colInt = abs(min(x1 + w1, x2 + w2) - max(x1, x2))
rowInt = abs(min(y1 + h1, y2 + h2) - max(y1, y2))
overlap_area = colInt * rowInt
area1 = w1 * h1
area2 = w2 * h2
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, h1], [x2, y2, w2, h2], ...]
'''
当通过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_array
box = [[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)
来源:http://xfxuezhang.cn/index.php/archives/231/


猜你喜欢
- 作者:HelloGitHub-追梦人物文中所涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库当博客上发布的文章越来越多时
- Spring Security 介绍到现在,我们还没连上数据库呢。真正的项目中,大部分情况下,我们都是自己设计权限数据库,例如微人事(htt
- 发现问题最近在将mysql升级到mysql 5.7后,进行一些group by 查询时,比如下面的SELECT *, count(id) a
- Anaconda是Python的一个开源发行版本,主要面向科学计算,预装了丰富强大的库。使用Anaconda可以轻松管理多个版本的Pytho
- exec sp_attach_db exun,'d:\exun2.mdf' 一句话就可以了。 网上看了那些比较繁琐的,都是s
- 前言Beautiful Soup是python的一个HTML或XML的解析库,我们可以用它来方便的从网页中提取数据,它拥有强大的API和多样
- Python使用pandas导入xlsx格式的excel文件内容1. 基本导入在 Python中使用pandas导入.xlsx文件的方法是r
- 一、按索引取数据①tf.gather()输入参数:数据、维度、索引例:设数据是[4,35,8],4个班级,每个班级35个学生,每个学生8门课
- 对象的创建模式Object 构造函数模式:先创建空对象,再动态添加属性和方法。适用场景:初始时对象内部数据不确定。存在问题:语句太多(这个问
- 概率论啊概率论,差不多忘完了。基于概率论的分类方法:朴素贝叶斯1. 概述贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称
- 本文实例为大家分享了python绘制散点图和折线图的具体代码,供大家参考,具体内容如下#散点图,一般和相关分析、回归分析结合使用import
- import shutil高级的文件,文件夹,压缩包的处理模块,也主要用于文件的拷贝shutil.copyfileobj(fsrc,fdst
- 随着移动端的用户越来越多,传统的web系统架构无法兼容很多移动终端的正常使用。在工作中也会发现,现在很多的客户都有在手机、平板等移动终端上使
- 本文实例讲述了Python实现文件内容批量追加的方法。分享给大家供大家参考,具体如下:#coding:utf-8import os#----
- 本文实例讲述了python异常处理用法。分享给大家供大家参考,具体如下:之前用Java的时候,在容易出错的地方我们经常使用try…catch
- Python解释器的相关配置,供大家参考,具体内容如下1、准备工作(1)Pycharm版本为3.4或者更高。(2)电脑上至少已经安装了一个P
- 主要内容一.网络存储是什么?二.iSCSI是什么?三.RDMA是什么?四.NVME-oF是什么?一.网络存储是什么?网络存储是一种将存储资源
- Flask-Login 为 Flask 提供用户会话管理。它处理登录、注销和长时间记住用户会话等常见任务。Flask-Login 不绑定到任
- 目前很多软件都限制单实例,大多数软件都是用Mutex来实现的 而这个东西咱们可以用handle去干掉它,并且不影响使用。 钉钉也是一样的步骤
- 如下所示:file->settings->Editor->General->Console里面的console co