Python合并同类别且相交的矩形框

news2024/11/18 11:21:09

Python合并同类别且相交的矩形框

  • 前言
  • 前提条件
  • 相关介绍
  • 实验环境
  • Python合并同类别且相交的矩形框
    • 代码实现

在这里插入图片描述

前言

  • 由于本人水平有限,难免出现错漏,敬请批评改正。
  • 更多精彩内容,可点击进入Python日常小操作专栏、YOLO系列专栏、自然语言处理专栏或我的个人主页查看
  • 基于DETR的人脸伪装检测
  • YOLOv7训练自己的数据集(口罩检测)
  • YOLOv8训练自己的数据集(足球检测)
  • YOLOv5:TensorRT加速YOLOv5模型推理
  • YOLOv5:IoU、GIoU、DIoU、CIoU、EIoU
  • 玩转Jetson Nano(五):TensorRT加速YOLOv5目标检测
  • YOLOv5:添加SE、CBAM、CoordAtt、ECA注意力机制
  • YOLOv5:yolov5s.yaml配置文件解读、增加小目标检测层
  • Python将COCO格式实例分割数据集转换为YOLO格式实例分割数据集
  • YOLOv5:使用7.0版本训练自己的实例分割模型(车辆、行人、路标、车道线等实例分割)
  • 使用Kaggle GPU资源免费体验Stable Diffusion开源项目

前提条件

  • 熟悉Python

相关介绍

  • Python是一种跨平台的计算机程序设计语言。是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。

实验环境

  • Python 3.x (面向对象的高级语言)

Python合并同类别且相交的矩形框

在这里插入图片描述

代码实现

在这里插入图片描述

import os
import cv2
import json
from collections import deque
import numpy as np

def xyxy2xywh(rect):
    '''
    (x1,y1,x2,y2) -> (x,y,w,h)
    '''
    return [rect[0],rect[1],rect[2]-rect[0],rect[3]-rect[1]]

def xywh2xyxy(rect):
    '''
    (x,y,w,h) -> (x1,y1,x2,y2)
    '''
    return [rect[0],rect[1],rect[0]+rect[2],rect[1]+rect[3]]


def is_RecA_RecB_interSect(RecA, RecB): # Rec = [xmin,ymin,xmax,ymax]
    # 获取交集区域的[xmin,ymin,xmax,ymax]
    x_A_and_B_min = max(RecA[0], RecB[0])
    y_A_and_B_min = max(RecA[1], RecB[1])
    x_A_and_B_max = min(RecA[2], RecB[2])
    y_A_and_B_max = min(RecA[3], RecB[3])
    # 计算交集部分面积, 当(xmax - xmin)为负时,说明A与B框无交集,直接置为0。 (ymax - ymin)同理。
    interArea = max(0, x_A_and_B_max - x_A_and_B_min) * max(0, y_A_and_B_max - y_A_and_B_min)
    return interArea > 0

def merge_RecA_RecB(RecA, RecB): # Rec = [xmin,ymin,xmax,ymax]
    # 获取合并区域的[xmin,ymin,xmax,ymax]
    xmin = min(RecA[0], RecB[0])
    ymin = min(RecA[1], RecB[1])
    xmax = max(RecA[2], RecB[2])
    ymax = max(RecA[3], RecB[3])
    return [xmin,ymin, xmax,ymax]

'''
递归是一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,
它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。
因此递归过程,最重要的就是查看能不能讲原本的问题分解为更小的子问题,这是使用递归的关键。


    终止条件:矩形框数为1或者为空。
    返回值: 新合并的矩形框
    本级任务: 每一级需要做的就是遍历从它开始的后续矩形框,寻找可以和他合并的矩形

'''
def merge_rect(box,labels):
    '''
    合并重叠框 

    输入参数: box :[[xmin,ymin,xmax,ymax],...]
            labels :['0', '0', '1', '1', '1', '2', '2', '2']

    返回:
        合并后的box:[[xmin,ymin,xmax,ymax],...]
        合并后的labels:['0', '1', '2']
    '''
    if len(box) == 1 or len(box) == 0 : # 矩形框数为1或者为空
        return box,labels

    for i in range(len(box)):
        RecA_xyxy = box[i]
        labelA = labels[i]
        for j in range(i+1, len(box)):
            RecB_xyxy = box[j]
            labelB = labels[i]
            if is_RecA_RecB_interSect(RecA_xyxy, RecB_xyxy)  and labelA==labelB:
                rect_xyxy = merge_RecA_RecB(RecA_xyxy, RecB_xyxy)
                # 使用remove(elem)来移除元素
                box.remove(RecA_xyxy)
                box.remove(RecB_xyxy)
                box.append(rect_xyxy)
                labels.pop(i)
                labels.pop(j-1)
                labels.append(labelA)
                merge_rect(box,labels)
                # 返回上一级循环,避免重复处理已合并的矩形
                return box,labels
    return box,labels

        

if __name__ == "__main__":
    color = {
        '0' : (255,0,0),
        '1' : (0,255,0),
        '2' : (0,0,255),
    }

    box = [[71, 32, 81, 109], [70, 80, 81, 111], [77, 221, 86, 240], [76, 220, 87, 258], 
           [76, 240, 87, 258], [150, 379, 160, 400], [151, 380, 160, 418], [151, 400, 160, 416]]
    labels = ['0', '0', '1', '1', '1', '2', '2', '2']
    print(labels,box,sep='\n')


    img = cv2.imread('res.png')
    for (xmin,ymin,xmax,ymax),label in zip(box,labels):
        img = cv2.rectangle(img, (xmin,ymin), (xmax,ymax), color[label], 1)
    cv2.imwrite('origin.jpg', img)


    merged_box,merged_labels = merge_rect(box,labels)
    print(merged_labels,merged_box,sep='\n')

    merged_img = cv2.imread('res.png')
    for (xmin,ymin,xmax,ymax),label in zip(merged_box,merged_labels):
        merged_img = cv2.rectangle(merged_img, (xmin,ymin), (xmax,ymax), color[label], 1)
    cv2.imwrite('merged.jpg', merged_img)

在这里插入图片描述

  • 由于本人水平有限,难免出现错漏,敬请批评改正。
  • 更多精彩内容,可点击进入Python日常小操作专栏、YOLO系列专栏、自然语言处理专栏或我的个人主页查看
  • 基于DETR的人脸伪装检测
  • YOLOv7训练自己的数据集(口罩检测)
  • YOLOv8训练自己的数据集(足球检测)
  • YOLOv5:TensorRT加速YOLOv5模型推理
  • YOLOv5:IoU、GIoU、DIoU、CIoU、EIoU
  • 玩转Jetson Nano(五):TensorRT加速YOLOv5目标检测
  • YOLOv5:添加SE、CBAM、CoordAtt、ECA注意力机制
  • YOLOv5:yolov5s.yaml配置文件解读、增加小目标检测层
  • Python将COCO格式实例分割数据集转换为YOLO格式实例分割数据集
  • YOLOv5:使用7.0版本训练自己的实例分割模型(车辆、行人、路标、车道线等实例分割)
  • 使用Kaggle GPU资源免费体验Stable Diffusion开源项目

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1115460.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

攻防世界web篇-disabled_button

一个不能按的按钮,试过点击,确实是点不了,所以只能查看源代码喽 经过仔细查看,发现这里多了disabled,这个参数在linux中是禁止的意思,大概是这个意思吧,毕竟开机不自启就用这个参数 在控制台这…

REACH 附录XVII发布关于微塑料限制管控要求是什么?如何办理?

REACH 附录XVII发布关于微塑料限制管控要求 2023年9月27日,欧盟官方公报(0JEU)发布了法规(EU)2023/2055,在REACH法规附件XVII中增加了第78条对微塑料的新限制要求。 新的限制将从2023年10月17日起生效,部分物品的过渡期将从4年延长到12年。…

【Java 进阶篇】深入了解 Bootstrap 全局 CSS 样式

Bootstrap 是一个流行的前端框架,以其强大的全局 CSS 样式而闻名。这些样式能够帮助开发者快速创建漂亮的、响应式的网页,而无需从头编写复杂的 CSS。在本文中,我们将深入探讨 Bootstrap 的全局 CSS 样式,适合初学者,帮…

WAL 模式(PostgreSQL 14 Internals翻译版)

性能 当服务器正常运行时,WAL文件不断被写入磁盘。但是,这些写操作是顺序的:几乎没有随机访问,因此即使是HDD也可以处理这个任务。由于这种类型的加载与典型的数据文件访问非常不同,因此有必要为WAL文件设置一个单独的物理存储&a…

kibana查看和展示es数据(index pattern、discover、dashboard)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

项目经理之项目经理必备素质能力

项目经理作为项目管理的核心人物,需要具备多种素质能力才能胜任这一重要角色。在本文中,我们将探讨项目经理必备的7个素质能力和决策判断的三种方式等,帮助您更好地了解如何成为一名优秀的项目经理。 7个素质能力要求 要能够识别与理解项目…

怎么从A和B仓库执行分别fetch操作?

目录 1.问题2.描述3.解决问题 1.问题 我希望从A仓库拉代码后推送到B仓库,结果A仓库代码新增分支后 在执行fetch时默认仓库地址为B仓库,导致fetch失败。 2.描述 在实际项目开发中我们可能会出现需要将同一个服务的代码推送到不同的代码仓库&#xff0c…

NDBC四十届:中国数据库从筚路蓝缕到迈向前列

自埃德加弗兰克科德(E.F.Codd)博士于1970年发表关系型数据库奠基论文 A Relational Model of Data for Large Shared Data Banks 以来,已历53载。 自1977年黄山首届中国数据库学术年会以来,已历46载。四十六年以来,中国…

产品新闻稿撰写流程是怎样的,纯干货

企业和品牌每年都会投放大量的产品新闻稿,一篇优质的产品新闻稿可以掀起更多的关注,收获更多的流量,如何在众多的新闻稿中脱颖而出,吸引读者的注意力?本文伯乐网络传媒将为您揭秘产品新闻稿撰写流程,教您如…

10月20日星期五今日早报简报微语报早读

10月20日星期五,农历九月初六,早报微语早读分享。 1、上海4岁走失女童遗体在宁波市某滩涂被发现,排除刑事案件; 2、中国多个实体和个人被指涉伊朗军工制造将遭美国非法单边制裁,外交部:坚决反对&#xff…

Apollo中的身份验证与授权:保护你的数据

前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 「推荐专栏」: ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄,vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

Axure RP静态站点的发布与内网穿透结合实现远程访问本地原型页面

文章目录 前言1.在AxureRP中生成HTML文件2.配置IIS服务3.添加防火墙安全策略4.使用cpolar内网穿透实现公网访问4.1 登录cpolar web ui管理界面4.2 启动website隧道4.3 获取公网URL地址4.4. 公网远程访问内网web站点4.5 配置固定二级子域名公网访问内网web站点4.5.1创建一条固定…

如何使用visual studio 2010构建SQLite3.lib文件

sqlite3官网只提供了dll,并没有lib文件。需要自己生成sqlite3.lib。因项目升级到x64,以前并没有生成64位的链接库,需要自己创建。本人电脑操作系统windows 10, 开发环境为visual studio 2010。下面是详细生成过程。 1. 从源下载源&#xff08…

Excel 5s内导入20w条简单数据(不使用多线程)

文章目录 Excel 5s内导入20w条数据1. 生成20w条数据1.1 使用Excel 宏生成20w条数据1.2 生成成功 2. ExecutorType:批量操作执行器类型2.1 ExecutorType.SIMPLE2.2 ExecutorType.BATCH2.3 ExecutorType.REUSE 3. 20w条数据直接插入数据库3.1 使用ExecutorType.SIMPLE…

集成学习方法之随机森林-入门

1、 什么是集成学习方法 集成学习通过建立几个模型组合的来解决单一预测问题。它的工作原理是生成多个分类器/模型,各自独立地学习和作出预测。这些预测最后结合成组合预测,因此优于任何一个单分类的做出预测。 2、 什么是随机森林 在机器学习中&…

2023年【电工(高级)】报名考试及电工(高级)模拟考试题

题库来源:安全生产模拟考试一点通公众号小程序 2023年【电工(高级)】报名考试及电工(高级)模拟考试题,包含电工(高级)报名考试答案和解析及电工(高级)模拟考…

水处理行业电能质量监测与治理系统解决方案

摘要:在水处理行业供配电系统中,涉及曝气风机、提升泵、污泥脱水设备等感性负荷设备,导致异步电动机产生较多无功功率和大量的谐波,使部分设备表现出轻载或不满载运行状况降低功率因数,以及谐波对配电系统、负载产生较…

FPGA从入门到精通(二十)SignalTapII

上一篇介绍了tcl脚本的应用,这一篇将介绍SignalTapII。 之前的工程我们是做仿真,设置激励,观察输出波形去判断代码没有问题,但事实上我们真实的需求是综合后的代码下载到FPGA芯片中能够符合预期。 其中可能出现问题的原因有&…

MD-MTSP:粒子群优化算法PSO求解多仓库多旅行商问题MATLAB(可更改数据集,旅行商的数量和起点)

一、多仓库多旅行商问题MD-MTSP 多旅行商问题(Multiple Traveling Salesman Problem, MTSP)是著名的旅行商问题(Traveling Salesman Problem, TSP)的延伸,多旅行商问题定义为:给定一个𝑛座城市…

如何拦截响应内容并修改响应头

背景及需求描述 背景 记录分享下近期遇到并解决的困扰了比较久的问题:在不同系统微信生态发现同一个cos地址用window.open(url)打开在苹果和安卓设备的微信生态上表现不一致:对于文档类型,响应头Content-Type: application/pdf 在安卓微信上…