一 计算矩形重叠面积的三种方法

方法1.两个矩形的宽之和,减去组合之后的宽就得到重叠区域的宽;高同理

def IOU(Reframe,GTframe):"""自定义函数,计算两矩形 IOU,传入为均为矩形对角线,(x,y)  坐标。·"""x1 = Reframe[0];y1 = Reframe[1];width1 = Reframe[2]-Reframe[0];height1 = Reframe[3]-Reframe[1];x2 = GTframe[0];y2 = GTframe[1];width2 = GTframe[2]-GTframe[0];height2 = GTframe[3]-GTframe[1];endx = max(x1+width1,x2+width2);startx = min(x1,x2);width = width1+width2-(endx-startx);endy = max(y1+height1,y2+height2);starty = min(y1,y2);height = height1+height2-(endy-starty);if width <=0 or height <= 0:ratio = 0 # 重叠率为 0else:Area = width*height; # 两矩形相交面积Area1 = width1*height1;Area2 = width2*height2;ratio = Area*1./(Area1+Area2-Area)# return IOUreturn ratio

方法2.两右下角顶点的小x减去两左上顶点的大x就得到重叠区域的宽;高同理

def calc_area(rect1, rect2):xl1, yb1, xr1, yt1 = rect1xl2, yb2, xr2, yt2 = rect2xmin = max(xl1, xl2)ymin = max(yb1, yb2)xmax = min(xr1, xr2)ymax = min(yt1, yt2)width = xmax - xminheight = ymax - yminif width <= 0 or height <= 0:return 0cross_square = width * heightreturn cross_square

方法3.若不想交返回0,若相交abs(x[1]-x[2])*abs(y[1]-y[2])

#include <cstdio>
#include <cmath>
#include <algorithm>  using namespace std;  int main()
{  double x[4],y[4];  while (scanf("%lf%lf",&x[0],&y[0])!=-1){  for (int i=1;i<=3;i++) scanf("%lf%lf",&x[i],&y[i]);  if (max(x[0],x[1])<min(x[2],x[3]) || min(x[0],x[1])>max(x[2],x[3]) || max(y[0],y[1])<min(y[2],y[3]) || min(y[0],y[1])>max(y[2],y[3])) printf("0.00\n");           //判断 两个矩形是否相交  else  {  //如果相交,直接求阴影面积,这点很巧妙、  sort(x,x+4); sort(y,y+4);  printf("%.2lf\n",abs(x[1]-x[2])*abs(y[1]-y[2]));  }        }
}  

二 计算旋转矩形的重叠面积

参考:https://blog.csdn.net/sda42342342423/article/details/79746736

  • cv2.rotatedRectangleIntersection(rect1, rect2)

    • 计算两个旋转矩形的交集,返回值 0,1,2分别表示没有,有,包含;以及交点的坐标的一个array。很遗憾的是这个坐标是不是逆时针也不是顺时针。而cv2.contourArea()需要点是顺时针或者逆时针。
    • 例子程序
# 中心点 矩形的w h, 旋转的theta(角度,不是弧度)
rect1 = ((0,0),(1,1),45)
rect2 = ((1.5,0),(4,3),0)
r1 = cv2.rotatedRectangleIntersection(rect1, rect2)
print r1
  • 多边形的点逆时针排序

    • Python 的自定义的排序程序只能返回0,1,-1。没有true,false。所以没return a > b种写法
    • 主要是根据所求出的重心,按照向量的叉积,然后排序
    • 排序函数如下:
def cmp(a, b):if a.x >= 0 and b.x < 0:return -1if a.x == 0 and b.x == 0:# return a.y > b.yif a.y > b.y:return -1elif a.y < b.y:return 1return 0det = (a.x - c.x) * (b.y - c.y) - (b.x - c.x) * (a.y - c.y)if det < 0:return 1if det > 0:return -1d1 = (a.x - c.x) * (a.x - c.x) + (a.y - c.y) * (a.y - c.y)d2 = (b.x - c.x) * (b.x - c.x) + (b.y - c.y) * (b.y - c.y)# return d1 > d2if d1 > d2:return -1elif d1 < d2:return 1return 0
  • cv2.contourArea()

    • 计算点所包围的面积
    • 坑点 dtype=’float32’
# 可行
r = ((2,-2),(-2,-2),(-2,2),(2,2))
r2 = cv2.contourArea(np.array(r))
# 可行
r = [[1,-1],[-1,-1],[-1,1],[1,1]]
r2 = cv2.contourArea(np.array(r))
# 不可行
r = np.full((len_p, 2), 0.0)
for i in range(len(pp)):print pp[i].x, pp[i].yr[i][0] = pp[i].xr[i][1] = pp[i].y
r2 = cv2.contourArea(r)
# 可行
r = np.full((len_p, 2), 0.0, dtype='float32')
for i in range(len(pp)):print pp[i].x, pp[i].yr[i][0] = pp[i].xr[i][1] = pp[i].y
r2 = cv2.contourArea(r)

代码

import cv2
import  numpy as npclass Point(object):def __init__(self, x, y):self.x = xself.y = ydef cmp(a, b, c):if a.x >= 0 and b.x < 0:return -1if a.x == 0 and b.x == 0:# return a.y > b.yif a.y > b.y:return -1elif a.y < b.y:return 1return 0det = (a.x - c.x) * (b.y - c.y) - (b.x - c.x) * (a.y - c.y)if det < 0:return 1if det > 0:return -1d1 = (a.x - c.x) * (a.x - c.x) + (a.y - c.y) * (a.y - c.y)d2 = (b.x - c.x) * (b.x - c.x) + (b.y - c.y) * (b.y - c.y)# return d1 > d2if d1 > d2:return -1elif d1 < d2:return 1return 0
## centerx, centery w, h, thetta
rect1 = ((0,0),(1,1),45)
rect2 = ((1.5,0),(4,3),0)r1 = cv2.rotatedRectangleIntersection(rect1, rect2)x = 0
y = 0
p = []
len_p = r1[1].shape[0]
for i in range(len_p):p.append(Point(r1[1][i][0][0], r1[1][i][0][1]))x += r1[1][i][0][0]y += r1[1][i][0][1]c = Point(x / len_p, y/len_p)pp = sorted(p, lambda x,y: cmp(x, y, c))
r = np.full((len_p, 2), 0.0, dtype='float32')
for i in range(len(pp)):print pp[i].x, pp[i].yr[i][0] = pp[i].xr[i][1] = pp[i].y
r2 = cv2.contourArea(r)
print r2

三 计算任意两个四边形的重叠面积

凸多边形相交,直接用一个裁切另外一个(Sutherland-Hodgman算法(多边形裁剪)),得到一个新的凸多边形(也可能不相交),然后求一下面积就行了(Mathwords: Area of a Convex Polygon)。

除此之外,还有1982年的 O’Rourke-Chien-Olson-Naddor algorithm,O(m+n)的时间复杂度。
C++代码参考:

https://blog.csdn.net/lcc_633/article/details/60321522

https://blog.csdn.net/nanhaizhixin/article/details/6531896

另外网友自己实现的任意矩形重叠的面积计算参考:

https://blog.csdn.net/cjbww/article/details/77503110

关于计算重叠四边形的面积的算法相关推荐

  1. 计算不规则四边形的面积+代码实现

    求两点间距离 /***** 求两点间距离*****/ float getDistance(CvPoint pointO, CvPoint pointA) {float distance;distanc ...

  2. LintCode 764. 计算圆周长和面积 Java算法

    描述 给定半径r,返回圆的周长nums[0]和面积nums[1].结果保留了两位小数. 说明 PI = 3.14 样例 - 样例 1:输入 : r = 2 输出 : [12.56, 12.56] 解析 ...

  3. 计算凸多边形面积的算法

    1. 思路: 可以将凸多边形(边数n > 3)划分为 (n - 2) 个三角形,分别运用向量叉积计算每个三角形的面积,最后累加各个三角形的面积就是多边形的面积. 2. 求多边形面积的算法模板: ...

  4. 算法会议室问题及计算重叠时间区间段

    算法会议室问题及计算重叠时间区间段 1. 会议室问题 2. 计算重叠时间区间段 1. 会议室问题 package com.zrj.algorithm.test;import cn.hutool.cor ...

  5. c++ 求四边形面积和周长_C语言编程题 题目:任意输入4个点,求围成四边形的面积是多少?C语言编程题 题目:任意输入4...

    C语言编程题 题目:任意输入4个点,求围成四边形的面积是多少? C语言编程题 题目:任意输入4 www.zhiqu.org     时间: 2020-12-07 我测试过了,四点一线,凹四边形,四边形 ...

  6. 这部计算机27厘米宽英语怎么说,24/27/32寸电脑显示器尺寸多大?长宽多少厘米?显示屏长宽与面积的算法...

    最近小编想了解24寸和27寸显示器的尺寸有多大,以及它们的长宽各是多少,于是网上查了一下,结果发现基本都是复制粘贴的垃圾答案,根本找不到一个正确的答案,于是小编便查阅了显示器尺寸的计算方法,从而求出电 ...

  7. matlab计算三角格网面积,不规则平面图形的面积计算及其MATLAB实现.doc

    摘要:面积的计算问题是我们在生产.生活中经常遇到的问题,对于平面图形的面积计算,能够考虑运用公式的,往往是那些比较规则的平面图形,诸如三角形.长方形.梯形等.其计算一般都有成熟的计算方法.然而,并不可 ...

  8. 计算任意多边形的面积

    转载自 对于凸多边形,很容易计算,如下图,以多边形的某一点为顶点,将其划分成几个三角形,计算这些三角形的面积,然后加起来即可.已知三角形顶点坐标,三角形面积可以利用向量的叉乘来计算. 对于凹多边形,如 ...

  9. OpenCV 识别图片中的米粒个数,并计算米粒的平均面积和长度(转)

    介绍 OpenCV+Python 使用OpenCV构建图像识别算法,识别图片中的米粒个数,并计算米粒的平均面积和长度 软件架构 模块:OpenCV 4.0.0.21 编程语言:Python 3.7.2 ...

最新文章

  1. POJ 3260 多重背包+完全背包
  2. HDU 5119 Happy Matt Friends ——(背包DP)
  3. eclipse中将项目打包成jar的两种方法,及其问题与解决方法
  4. 报告:2019-2025年,全球数据中心年复合增长率将超过7%
  5. python提取每个单词首字母_Python 2:str.title()(使字符串每个单词首字母大写)...
  6. mysql 在字段中计算_整数在MySQL的计算字段中
  7. 2018 java蓝桥杯校赛题目
  8. mfc try catch 捕获并显示_你的异常捕获够优雅不?求你别只会try{...} catch{...}了
  9. 01 | 基础架构:一条SQL查询语句是如何执行的?笔记(转)
  10. 英特尔发布边缘软件中心,抢滩 650 亿美元智能边缘市场!
  11. Linux中运行c程序,与系统打交道
  12. Vue之路由push
  13. ftp扫描工具下载,ftp扫描下载工具到底该怎么选择?
  14. nodejs怎么使用爬虫HTTP代理IP抓取数据
  15. ctf MISC 放松一下吧
  16. unity3d 地面印花_Unity3D 中的贴花效果 – 苍白的茧
  17. cf登录服务器未响应,大神详解win7系统玩cf未响应的图文方法
  18. 阿里云ECS开放指定端口步骤
  19. Hexo建站总结 Github静态网页
  20. 百度/Google等搜索引擎的信息检索搜索技巧总结

热门文章

  1. 图文详解 Windows 2003服务器集群安装(5)(完)
  2. 哔哩哔哩websocket协议逆向--制作一个属于自己的弹幕姬
  3. 147. 对链表进行插入排序嗯嗯对的
  4. laravel-excel使用(老猫包子店的故事)
  5. 【Java】有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
  6. SpringBoot + Spring Security Oauth2 客户端授权
  7. 微信移动端数据库组件WCDB系列(二) — 数据库修复三板斧
  8. 弘辽科技:“拼夕夕”华丽变装为“拼爹爹”的成功秘诀
  9. 【Ceph 】Async 网络通信源代码分析--研读
  10. AUTOMATE THE BORING STUFF WITH PYTHON读书笔记 - 第8章:INPUT VALIDATION