Python合并重叠矩形框

 更新时间:2022年03月17日 11:58:22   作者:songxf  
这篇文章主要介绍了Python合并重叠矩形框,循环+递归,依次判断两个框是否有重叠,下面具体实现过程需要的小伙伴可以参考一下

需求:

  • NMS中的IOU相关,是选择一个最大或者可信度最高的框框保留。
  • 而我们现在试需要将重叠框框合并为一个大的框框,所以不能直接用上面的。
  • 并且OpenCVgroupRectangles在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)

到此这篇关于Python合并重叠矩形框的文章就介绍到这了,更多相关Python合并矩形框内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python网络爬虫 CrawlSpider使用详解

    python网络爬虫 CrawlSpider使用详解

    这篇文章主要介绍了python网络爬虫 CrawlSpider使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • Python制作微信好友背景墙教程(附完整代码)

    Python制作微信好友背景墙教程(附完整代码)

    这篇文章主要介绍了Python制作微信好友背景墙教程(附完整代码),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • python实现翻转棋游戏(othello)

    python实现翻转棋游戏(othello)

    这篇文章主要为大家详细介绍了python实现翻转棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • python读取hdfs并返回dataframe教程

    python读取hdfs并返回dataframe教程

    这篇文章主要介绍了python读取hdfs并返回dataframe教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • Python实战案例之可增删改查的员工管理系统

    Python实战案例之可增删改查的员工管理系统

    本实战案例主要对MySQL进行一些基本操作,通过完成本实验任务,要求学生熟练掌握MySQL的增删改查,并对MySQL的增删改查基本操作进行管理员工的信息,需要的朋友跟着小编往下看吧
    2021-10-10
  • python实现的系统实用log类实例

    python实现的系统实用log类实例

    这篇文章主要介绍了python实现的系统实用log类,实例分析了Python基于logging模块实现日志类的相关技巧,需要的朋友可以参考下
    2015-06-06
  • python 实现线程之间的通信示例

    python 实现线程之间的通信示例

    这篇文章主要介绍了python 实现线程之间的通信示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • python使用pymysql实现操作mysql

    python使用pymysql实现操作mysql

    本文给大家讲解的是在python中使用pymysql实现操作mysql的方法汇总,非常的简单实用,有需要的小伙伴可以参考下
    2016-09-09
  • Django项目创建及管理实现流程详解

    Django项目创建及管理实现流程详解

    这篇文章主要介绍了Django项目创建及管理实现流程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • Django的ALLOWED_HOSTS配置方法

    Django的ALLOWED_HOSTS配置方法

    allowed_hosts 参数是用于设置 Django 的域名白名单的,本文主要介绍了Django的ALLOWED_HOSTS配置方法,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06

最新评论