我的编程空间,编程开发者的网络收藏夹
学习永远不晚

(十三) minAreaRect函数

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

(十三) minAreaRect函数

minAreaRect函数


欢迎访问个人网络日志🌹🌹知行空间🌹🌹


1.背景

在做旋转物体检测时,通常期望得到对象的带角度最小面积包围矩形,如下图对卫星图像航空母舰的检测:

在这里插入图片描述

若已经获取了对象的轮廓,可以通过OpenCV中的minAreaRect方法获取对象的最小面积包围框。

2.minAreaRect 函数

RotatedRect cv::minAreaRect(InputArray points)

入参

  • points 是点的集合,如轮廓

返回值

center(x,y), (width, height)分别是旋转矩形框中心的坐标和矩形的宽和高。值得注意的是最后一个元素angle of rotation旋转角的定义。旧版本和新版本的定义有些许的差异,具体是以4.5.1为分界,小于4.5.1使用了旧的定义方法,4.5.1及之后都采用了新的旋转角定义方法。具体可见OpenCV GitHub Issue。新旧版本旋转角度的定义如下【图片来自于 mmRotate】:

在这里插入图片描述

对于新版的定义,以旋转矩形框y最小,y相等时x最小的点为旋转点,以x轴正方向开始顺时针旋转碰到旋转矩形框第一条边时所转过的角度,旋转重合的第一条边算做width,另一条算做height,其取值范围为 ( 0 , π / 2 ] (0, \pi/2] (0,π/2],当x轴与一条边重合时取 π / 2 \pi/2 π/2。对于旧版的定义,以旋转矩形框y最大,y相等时x最小的点为旋转点, 逆时针方向旋转碰到的第一条边与x轴所成的角,其取值范围为 [ − π / 2 , 0 ) [-\pi/2,0) [π/2,0)

3.以新版为例

img = np.zeros((300, 500), dtype=np.uint8)contour = np.array([[20, 100], [100, 20], [320, 220], [380, 290]], dtype=np.int32)cv2.drawContours(img, [contour], -1, 255, cv2.FILLED )rotRect = cv2.minAreaRect(contour) # 返回值 (center(x,y), (width, height), angle of rotation )print(rotRect)rect = cv2.boxPoints(rotRect).astype(np.int32)img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)cv2.drawContours(img, [rect], -1, (0,0, 255), 4)cv2.imwrite("img.png", img)# >>># ((225.22630310058594, 147.20277404785156), (407.0626525878906, 108.09146881103516), 27.8240966796875)

在这里插入图片描述

cv2.minAreaRect函数的返回值是旋转矩形框中心点的坐标和框的宽高,想要在图像画出旋转矩形框还需要将其转成4个顶点的形式,使用boxPoints即可求出四个顶点的坐标。此外还可以手动的来求,也比较简单,假设以旋转点为原点,矩形框width的边为新的x轴建立新的坐标系,则和原图像坐标系之间是只有旋转变换,求出其旋转矩阵即可完成点的变换,可参考,代码如下,可见结果很接近(计算精度存在误差):

def rotate_oc_points(bbox):    xc, yc, w, h, ag = bbox[:5]    ag = ag/180*np.pi    wx, wy = w / 2 * np.cos(ag), w / 2 * np.sin(ag)    hx, hy = -h / 2 * np.sin(ag), h / 2 * np.cos(ag)    p1 = (xc - wx - hx, yc - wy - hy)    p2 = (xc + wx - hx, yc + wy - hy)    p3 = (xc + wx + hx, yc + wy + hy)    p4 = (xc - wx + hx, yc - wy + hy)    return np.array([p1, p2, p3, p4], dtype=np.int32)img = np.zeros((300, 500), dtype=np.uint8)contour = np.array([[20, 100], [100, 20], [320, 220], [380, 290]], dtype=np.int32)cv2.drawContours(img, [contour], -1, 255, cv2.FILLED )rotRect = cv2.minAreaRect(contour) # 返回值rect = cv2.boxPoints(rotRect).astype(np.int32)print(f"by boxPoints:\n {rect}")rect = rotate_oc_points([*rotRect[0], *rotRect[1], rotRect[2]])print(f"by rotate_oc_points:\n {rect}")img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)cv2.drawContours(img, [rect], -1, (0,0, 255), 4)cv2.imwrite("img.png", img)# >>># by boxPoints:#  [[ 19  99]#  [ 70   4]#  [430 194]#  [380 290]]# by rotate_oc_points:#  [[ 70   4]#  [430 194]#  [379 289]#  [ 19  99]]

欢迎访问个人网络日志🌹🌹知行空间🌹🌹


参考资料

来源地址:https://blog.csdn.net/lx_ros/article/details/126275103

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

(十三) minAreaRect函数

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

函数(三)

闭包函数定义:函数内部函数对外部作用域而非全局作用域的引用两张函数参数的方式使用参数def func(x) print(x)func(1)func(1)11包给参数def outter(x) def inner() p
2023-01-31

简单三行代码函数实现几十行Typescript类型推导

这篇文章主要为大家介绍了简单三行代码函数实现几十行Typescript类型推导的方案示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-01-15

第十四天-内置函数

内置函数:传送门—————————————————# 匿名函数# 为了解决一些简单的需求⽽设计的一句话函数 不需要def来声明 一句话就可以声明一个函数# 函数名 = lambda 参数: 返回值 1 # 例子 lambda 求和 求幂 2
2023-01-30

(十三)数据库查询处理之QueryExecution(2)

原文:https://www.cnblogs.com/JayL-zxl/p/14497016.html
(十三)数据库查询处理之QueryExecution(2)
2019-08-24

第十一节:pandas统计函数

1、pct_change()计算增长比例2、cov()协方差3、corr()相关系数4、rank()数据排名5、numpy聚合函数
2023-01-30

爬虫逆向实战(二十三)--某准网数据

一、数据接口分析 主页地址:某准网 1、抓包 通过抓包可以发现数据接口是api_to/search/company_v2.json 2、判断是否有加密参数 请求参数是否加密? 通过查看“载荷”模块可以发现b参数和kiv参数是加密参数 请求
2023-08-30

数据库学习之十三:mysql高可用配置

十三、mysql高可用1、普通主从复制架构存在的不足高可用?业务不间断的工作。用户的体验不出来业务断点。普通主从环境,存在的问题:1、监控的问题:APP应用程序,并不具备监控数据库的功能,没有责任监控数据库是否能连接。2、选主的问题:3、failover:VI
数据库学习之十三:mysql高可用配置
2019-12-19

Python入门之三角函数atan2()函数详解

描述atan2() 返回给定的 X 及 Y 坐标值的反正切值。语法以下是 atan2() 方法的语法:import math math.atan2(y, x)注意:atan2()是不能直接访问的,需要导入 math 模块,然后通过 math
2022-06-04

Python中常用的十个函数介绍

这篇文章主要介绍了Python中常用的十个函数,shutil是Python中的高级文件操作模块,与os模块形成互补的关系,需要的朋友可以参考下
2023-05-14

javascript怎么求三角函数

在数学中,三角函数是一种经常出现的函数类型,它可以帮助我们计算三角形的边长、角度和高度等等。在计算机编程中,JavaScript也提供了一些内置的三角函数来帮助开发者进行相关计算。在本文中,我们将介绍JavaScript的三角函数及其用法。JavaScript的三角函数可以使用Math对象的静态方法进行调用。该对象提供了sin、cos、tan、asin、acos、atan等方法
2023-05-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录