由检测2个矩形框的重叠程度,来理理解决问题的思路

判断两个矩形是否有重叠 今天笔试遇到这个题目,原来是图像中的问题:判断图像中检测到的两个人脸框矩形是否有重叠部分,并计算重叠大小,从而确认是否为同一个人脸。 直接判断的话,情况有点多,比如: 这样代码就比较繁琐了。 如果是先考虑没有重叠呢? 如上图所示,没有重叠的话,可以分为四种情况,假设红色矩形为A,绿色矩形为B,那么B可以分别在A的上、下、左、右四种情况。 设A的左上角坐标为p1,右下角坐标为p2,B的左上角坐标... 阅读详情

大家好,我是TF男孩,一位编程表演艺术家。下面我给大家表演一段编程:用python来检测两个矩形框的重叠程度。

一、开场:应用场景

首先,什么是矩形框的重叠程度

两个矩形框的重叠关系存在很多种可能性:横向有交集、纵向有交集、完全无交集、部分或全部重叠。
在这里插入图片描述
为什么要检测重叠程度?这其实是我在工作中遇到的一个问题。

1.1 散点值只能获坐标,规整行无法取蹊径

我刚刚完成了这么一个功能,就是把纸质试卷进行电子化,主要操作的,就是下面这样的试卷。
请添加图片描述

我把它变成html版本的。

请添加图片描述

还要能生成word文件并下载,对于里面的公式、表格也可以进行正常编辑。

请添加图片描述

这里涉及到目标检测、OCR识别、word写入等技术。不过,今天的重点是:识别后的数据结构是散点式的,识别结果是由字符块组成的。

[
  {
    "y2": 158,
    "x2": 86,
    "word": "有",
    "x1": 68,
    "y1": 144
  },
  {
    "h": 158,
    "w": 97,
    "word": "效",
    "x1": 73,
    "y1": 144
  },
  {
    "y2": 158,
    "x2": 101,
    "word": "值",
    "x1": 85,
    "y1": 144
  },
  {
    "y2": 158,
    "x2": 117,
    "word": "是",
    "x1": 97,
    "y1": 144
  },
  {
    "y2": 169,
    "x2": 164,
    "word": "(公式)\\frac { \\sqrt 2 } { 2 } N e _ { 0 }",
    "x1": 118,
    "y1": 133
  }
]

你需要根据坐标,将它们排列成如下的结构:

请添加图片描述

1.2 算重叠或许得排位,计包含定能获从属

因为每个字都是一个小矩形,我们只有它们的坐标数据。于是,判断两个矩形的重叠情况就很有必要了。

如下图所示,如果文本1的矩形区域和公式1的矩形区域,在横向上有一定比例的重叠,那我们可以认为,它们是处于同一行。

请添加图片描述

如果文本2的区域完全包含(重叠率100%)于表格1的区域中,那么我们可以认为文本2属于表格1内的内容。同样,文本2文本3在纵向的重叠率,可以作为它俩是否位于同一列的指标。

二、表演:解决方案

我们要解决的这个问题,很有意思,我感觉它上升到了艺术的高度,非常唯美(你可能觉得我有些癫狂,但我真的就是这么认为的)。

之所以说它有艺术,就在于解决方案太多了,美不胜收,众里寻她。

2.1 用穷举分门别类,使判断千丝万缕

很简单啊,分情况做判断就行。

如果是完全包含,也就是这个情况:
请添加图片描述

以python代码举例:

if b_x1 > a_x1 and b_x2 < a_x2 and b_y1 > a_y1 and b_y2 < a_y2:
    print("重合率100%")

如果是完全无重叠,那就是这样:
请添加图片描述

if b_x1 > a_x2 and b_y1 > a_y2: # 右下角:b左超a右,b上超a下,则无交集
    print("重合率0%")

这是相对于右下角的情况。除此之外,还要考虑其他3个方位的判断。而且还要考虑两个目标互换位置的情况(谁是a框,谁是b框)。

上面只是判断重叠率为100%和重叠率为0%这两种极端情况,这还是比较简单的。但是,我们已然发现有了很多的if判断。

你可以试着想一下,如果要计算具体的重叠率,那需要怎么写?

请添加图片描述

谁在上来谁在下,谁在左来谁在右,下面的下多少,右面的又右多少……不知怎么地,我忽然想起了刘三姐对山歌……

请添加图片描述

反正我不敢采用分情况判断的写法,我害怕这样写,我和程序都会崩溃掉。

2.2 图形、数组两方斗,几何、代数一家亲

我们一直都在考虑空间的问题,谁左谁右,谁偏谁多少距离,这其实是几何问题。

请添加图片描述

当几何问题解决繁琐时,我们可以考虑用袋鼠……带数……对!就是你纠正的那个词语。

代数里面有个集合,集合几何同音,可以试试从这个点切入。

我们拿矩形框在X轴方向的重叠来看,所谓重叠,其实就是有多少个相同元素。

请添加图片描述

矩形A和矩形B在X轴重叠情况,其实就是集合A和集合B,相同元素个数的占比。

我们看到,矩形A和矩形B是有相同元素的,集合C同前两者没有相同元素,即没有任何重叠。

这么一转,豁然开朗。

我们来计算一下X方向的重叠情况:

# a_x1, a_y1, a_x2, a_y2 = 矩形a的(左上角x, 左上角y, 右下角x, 右下角y)
# b_x1, b_y1, b_x2, b_y2 = 矩形b的(左上角x, 左上角y, 右下角x, 右下角y)
ax = [i for i in range(a_x1,a_x2+1)] # 生成a的元素集合
bx = [i for i in range(b_x1,b_x2+1)] # 生成b的元素集合
x_sam_len = len(set(ax) & set(bx)) # 求相同元素个数
x_len = min(a_x2-a_x1, b_x2-b_x1)+1 # 获取哪个集合更短
x_rate = x_sam_len/x_len # 相同元素个数/更短集合 = 重合率

注释很清晰,已经比代码多了,我也不敢再多嘴了。

看,这里面没有一个if语句,也实现了重叠情况的判断和计算。

总体的判断,下面一个方法就可以实现,可以直接复制来用,不用导入任何包:

# 两个矩形区域重叠比率,输入a[x1,y1,x2,y2] b[x1,y1,x2,y2],输出横纵方向
def get_same_rate(a,b):
    a_x1,a_y1,a_x2,a_y2 = a
    b_x1,b_y1,b_x2,b_y2 = b
    # X方向
    ax = [i for i in range(a_x1,a_x2+1)]
    bx = [i for i in range(b_x1,b_x2+1)]
    x_sam_len = len(set(ax) & set(bx))
    x_len = min(a_x2-a_x1, b_x2-b_x1)+1
    x_rate = x_sam_len/x_len
    # Y方向
    ay = [i for i in range(a_y1,a_y2+1)]
    by = [i for i in range(b_y1,b_y2+1)]
    y_sam_len = len(set(ay) & set(by))
    y_len = min(a_y2-a_y1, b_y2-b_y1)+1
    y_rate = y_sam_len/y_len

    return x_rate,y_rate

调用方法如下所示,我们实验几组看看效果:

# %% [左上角x, 左上角y, 右下角x, 右下角y]
ra = [0,0,10,10]
rb = [4,4,8,8]
x_rate,y_rate = get_same_rate(ra,rb)
x_rate,y_rate # (1.0, 1.0)

ra = [0,0,10,10]
rb = [20,20,28,28]
x_rate,y_rate = get_same_rate(ra,rb)
x_rate,y_rate # (0.0, 0.0)

ra = [0,0,10,10]
rb = [8,8,18,10]
x_rate,y_rate = get_same_rate(ra,rb)
x_rate,y_rate # (0.27, 1.0)

效果还是不错的,可单独X,可单独Y,可以结合XY做综合判断,可盐可甜。

三、谢幕:归纳总结

编程是门艺术,大家对艺术的理解不一样,追求也不一样。

今天快下班时,一同事一直感叹:“哎呀~啧啧啧……fastapi太优雅了,优雅,好优雅!”。赞美之词,生于真心,溢于言表,晚上回去都会做美梦的那种赞赏。

编程之美就在于,对于同一个功能,有好多种实现方式:可以嵌套5层for循环,也可以混成map排序;可以写ifelse通过参数走分支,也可以子类重写父类方法直接同一句代码调用。

说到这里,我又想起了一件事。你看,艺术家总是这么多愁善感。

想听的听,不想听的可以撤了,走前别忘了点赞。

话说,我回老家去买鸡,活鸡现宰。杀鸡店老板现场处理,因为过节,排队的人巨多,都催着赶紧弄。老板带着口罩,全身心投入,摘毛,冲洗,掏内脏,如入无人之境。在巨大工作量面前,他得心应手,弯腰捡个地下的工具,起身还要单独冲冲手。装袋前,会把肉重新冲一遍,擦干净手,装两层袋子。活鸡宰杀切割,送到你手里时,你接触不到任何油污。我敢说,济南任何一家超市都做不到这一点。

真的非得是慢工才能出细活吗?

习惯也很重要吧。

我们老说时间不够,时间不够,所以代码写的不规范。但是,假设,假设有一天,时间给得很充足,那时你是否会,突然变出那个习惯去写注释、去思考效率问题。这就像,你放假了,有空闲了,屋子就会变干净吗?你自己回答。但是,对于爱干净的人来说,即便很忙,房子依然是整洁的。

再就是,解决问题思路还得开放些,几何不行就用代数,代数不行就找我,我是编程表演艺术家TF男孩,擅长编程表演。提醒你早撤,现在晚了。下一次我表演的节目是:人工智能训练音频文件,实现语音识别,并控制LED灯转向。欢迎关注。

从零开始创建Davinci Configurator配置工程 本文介绍了从零开始搭建达芬奇工程的详细步骤。首先安装Vector的CBD包后,通过DavicCFG.exe新建空白ECU工程。文章提到Postbuild相关概念可参考往期文章《AUTOSAR配置中的PostBuild、Precompile、Linktime》,并预告下期将讲解如何通过导入DBC文件来启用AUTOSAR模块。全文以实操截图为主,步骤清晰简明,适合开发者参考备份。 阅读详情

相关推荐

2025最新湖北省村界村级行政区划矢量shp数据下载

2025最新湖北省村界村级行政区划矢量shp数据,几万个面,属性包含村、社区乡、街道镇、市多级属性,非常准确

3种解法 - 判断矩形重叠

题目 矩形以列表 [x1, y1, x2, y2] 的形式表示,其中 (x1, y1) 为左下角的坐标,(x2, y2) 是右上角的坐标。 如果相交的面积为正,则称两矩形重叠。需要明确的是,只在角或边接触的两个矩形不构成重叠。 给出两个矩形,判断它们是否重叠并返回结果。 示例 1: 输入:rec1 = [0,0,2,2], rec2 = [1,1,3,3] 输出:true 示例 2: 输入:rec...

具身小站 9826

python计算两个矩形框重合百分比的实例

今天小编就为大家分享一篇python计算两个矩形框重合百分比的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

判断两个矩形是否重叠

判断两个矩形是否重叠关于如何判断两个矩形重叠,这是我在实际项目开发当中曾经遇到过的问题:“判断图像中检测到的两个人脸框矩形是否有重叠部分,并计算重叠大小,从而确认是否为同一个人脸”。后来,在浏览博客时,也发现也有人将这个问题当做面试题目,并进行过讨论,但是,列出的代码过于繁杂,不敢恭维。所以,写下这篇博文,并贴出代码,供大家参考。

李青锋的专栏 5万+

解决图像目标检测两框重叠问题

文章目录1 问题现象2 解决办法3 Non-Maximum Suppression 原理3.1 什么是非极大值抑制3.2 为什么要用非极大值抑制3.3 如何使用非极大值抑制3.4 效果4 参考资料: 1 问题现象 使用yolo v3 等目标检测模型训练自己数据集,预测图片时出现问题: 两框重叠,如下图所示:对于同样一辆汽车,模型反复的标记。 2 解决办法 解决办法就是:非极大值抑制(Non-M...

和而不流 2万+

剑指offer——矩形覆盖(5)Python实现

题目:我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形重叠地覆盖一个2*n的大矩形,总共有多少种方法? 考点:递归和循环 分析: 当 n=1时,有一种覆盖方法。f(1)=1 当 n=2时,有两种覆盖方法。f(2)=2 当n=3时,  分为两种情况: 第一次用一个矩形竖着覆盖(左图蓝色),则剩下共有f(n-1)种方法,即f(2) 种方法; 第一次...

weixin_40533355的博客 400

判断矩形是否重叠(结构)

题目描述 用具有x,y两个整型变量成员的结构类型SPoint来表示坐标点。用SRect结构类型来描述矩形,其中包含p1和p2两个SPoint成员分别表示矩形对角线上的两个点。 编写判断两个矩形是否重叠的函数bool isoverlap(const SRect &rect1, const SRect &rect2)。 主函数输入两个矩形,调用isoverlap函数判断是否重叠。 输入 判断次数 矩形1的对角线顶点坐标x1、y1、x2、y2 矩形2的对角线顶点坐标x1、y1、x2

笔记 2352

2.判断两个矩形框是否有重叠

判断两个矩形框(不包括旋转)是否有重叠,可以通过比较它们的边界来确定。在水平方向上,矩形A和矩形B的投影有交集。在垂直方向上,矩形A和矩形B的投影有交集。两个矩形重叠的条件是:它们在水平方向(x轴)和垂直方向(y轴)上都有交集。矩形框1:左上角坐标 (x1,y1),右下角坐标 (x2,y2)矩形框2:左上角坐标 (x3,y3),右下角坐标 (x4,y4)如果这两个方向上的重叠条件都满足,那么两个矩形就是重叠的。

manyuan4374的博客 622

如何解决目标检测两个物体重叠问题

非极大值抑制(Non-Maximum Suppression) IoU:intersection-over-union,即两个边界框的交集部分除以它们的并集。 非极大值抑制的流程如下: 根据置信度得分进行排序 选择置信度最高的比边界框添加到最终输出列表中,将其从边界框列表中删除 计算所有边界框的面积 计算置信度最高的边界框与其它候选框的IoU。 删除IoU大于阈值的边界框 重复上述过程,直至边界框列表为空 所以一般具体解决办法就是减小 IoU threshold (IoU 阈值) ...

重剑无锋博客 5195

判断两个矩形是否重叠、包含情况 java

###### 新手小白学习java,遇到需要求解让用户输入两个矩形的坐标和长宽来判断两个矩形的相交情况,浅记录一下这个算法 ###### public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.println("输入第一个矩形的x, y, width and height :"); double x1 = input.nextDouble(

Gonglyon的博客 1205

分享一个小方法,判断同一坐标系下两个矩形是否有重合

最近项目中遇到一个问题,需要判断两个矩形是否有重合,以及重合的面积是否超过指定值。 其实是一个很简单的数学问题,这里发出来给大家分享一下。 先说思路,**同一坐标系下**,判断两个矩形是否有重合,有以下三种情况: 1、两个矩形,其中一个包含在另一个之中,这种肯定是重合的; 2、两个矩形,完全不重合,即没有交叉重合的区域; 3、两个矩形,有部分重合在一起,形成一个新的重合矩形。 下面这个图形就是第三种情况 ![在这里插入图片描述](https://img-blog.csdnimg.cn/23b1c55641a

韶华易逝的博客 4303

判断两个框是否重叠

2在框1的局部坐标系的x轴方向是否重叠,在y轴方向是否重叠。然后再反过来是框1在框2的局部坐标系。

betterthanYSD的博客 191

python3, 计算两个矩形框是否重叠,并计算重叠

1

tutu96177的博客 9019

python实现提取文件名某个字符串并新建文件夹保存,判断两个矩形是否相交或重合

循环遍历文件夹,保存文件,新建文件夹保存文件 python提取字符串中某个字符前后的字段 python计算两个矩形是否相交或重合度

m0_56698268的博客 1346

python计算两个矩形重叠_python计算两个矩形框重合百分比的实例

python计算两个矩形框重合百分比的实例如下所示:def mat_inter(box1,box2):# 判断两个矩形是否相交# box=(xA,yA,xB,yB)x01, y01, x02, y02 = box1x11, y11, x12, y12 = box2lx = abs((x01 + x02) / 2 - (x11 + x12) / 2)ly = abs((y01 + y02) / 2 ...

weixin_39588223的博客 2038

旋转矩形问题

矩形的坐标是旋转前的坐标:矩形A(left1,top1,width1,height1,angle1)矩形B(left2,top2,width2,height2,angle2)

Ken的博客 1746

C++ 判断两个矩形是否重叠(Find if two rectangles overlap)

我们需要编写一个函数bool doOverlap(l1, r1, l2, r2),如果两个给定的矩形重叠,则返回 true。一种解决方案是逐个选取一个矩形的所有点,然后查看该点是否位于另一个矩形内。2 ) 一个矩形位于另一个矩形左边缘的左侧。注意,一个矩形可以用两个坐标表示,左上角和右下角。1 ) 一个矩形位于另一个矩形的上边缘上方。给定两个矩形,判断这两个矩形是否重叠。l1 :第一个矩形的左上角坐标。r1 :第一个矩形的右下角坐标。l2 :第二个矩形的左上角坐标。r2 :第二个矩形的右下角坐标。

csdn_aspnet的专栏,请点击博客主页右上角三个点中的私信联系 1万+

yolov5多个重叠问题

NMS(Non-Maximum Suppression,非极大值抑制)是一种在计算机视觉和目标检测领域常用的技术。它通常用于在图像或视频中找出物体或目标的位置,并剔除重叠的边界框,以确保最终的检测结果准确且不重叠

笔记 8493
上一篇: 我裁完兄弟后,辞职了,转行做了一名小职员
下一篇: 详解one-hot独热编码
TF男孩
博客等级 码龄11年 92粉丝 11原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值