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/
0
投稿
猜你喜欢
- 其实网上有很多关于python2.6.6 升级到python2.7的文章,但是我对比这些类似的文章升级之后,发现其中有错误的地方,于是决定还
- 建立资料表:Step1首先开启phpmyadmin,进入wordpress资料库中,并新增一个wp_gbook的资料表与栏位数目8。Step
- 方法一使用Python中的内置函数isupper()和islower()来判断一个字母是否为大写或小写字母。# 获取用户输入letter =
- 1 图1第一个图是蚊香,感兴趣的小伙伴可以自己尝试在python中用turtle库绘制一下。具体代码如下:#画蚊香import turtle
- 在SQL Server 2005中,它的另外一个强大的新特点是数据库快照。数据库快照是一个数据库的只读副本,它是数据库所有数据的映射,由快照
- 函数名称:CheckForm_JS(frmName,errStr)功能:用ASP的方法动态写出JavaScript的表单验证的函数check
- 简单的学习下利用socket来建立客户端和服务端之间的连接并且发送数据1. 客户端socketClient.py代码import socke
- 目录一、🌕月亮二、🌕雪花月饼一、🌕月亮导入库matplotlib和numpy,作为工具直接用。from mpl_toolkits.mplot
- 如何用数据库制作一个多用户版的计数器?代码和说明如下:count.asp' 计数器的核心程序<%Set c
- 简单的LSTM问题,能够预测一句话的下一个字词是什么固定长度的句子,一个句子有3个词。使用one-hot编码各种引用import keras
- 函数的返回值返回结果要怎么做,多个结果又要怎么做# 函数返回值# 概念:函数执行完以后会返回一个对象,如果在函数内部有return 就可以返
- 一个用asp来处理jmail发信的过程,及使用方法. 发信时,直接调用这个过程就行了,很方便。<% dim
- 今天有朋友问我 Turtle的安装问题,在这里简单说在github上我们可以看到Turtle这个库很久没有更新了,里面还有一些python3
- 一、安装selenium库问题1:什么是selenium模块?基于浏览器自动化的一个模块。 问题2:selenium模块有什么作用
- 析构函数当某个对象成为垃圾或者当对象被显式销毁时执行。PHP5中提供的析构函数是__destruct,其与构造方法__construct相对
- 介绍Python模块argparse,这是一个命令行选项,参数和子命令的解释器,使用该模块可以编写友好的命令行工具,在程序中定义好需要的参数
- 今天有个需要需要传递中文参数给URL但是在GBK环境下的脚本传递GBK的参数老是给我报UNICODE的解码错误。烦的很。所以我们果断选择用u
- 前言在进行业务数据分析时,往往需要使用pandas计算环比、同比及增长率等指标,为了能够更加方便的进行的统计数据,整理方法如下。1.数据准备
- 列表的索引取值1. 列表的索引和字符串一样,列表中的每一个元素也都有一个属于自己的编号,这个编号就是列表的索引。2. 列表索引取值通过字符串
- TensorFlow保存模型代码import tensorflow as tffrom tensorflow.python.framewor