Python OpenCV中cv2.minAreaRect实例解析
作者:求则得之,舍则失之 发布时间:2022-09-02 19:36:58
在这个文章中,我们将学习如何在感兴趣区域周围画最小面积矩形框。
1.最小面积矩形框
下图显示了两个矩形框,绿色的是普通矩形框,红色的是最小面积矩形框。可以发现,红色的是旋转矩形。
OpenCV提供了一个函数cv2.minAreaRect来寻找最小面积的旋转矩形。将2D点集作为输入,并返回一个Box2D结构,其中包括以下详细信息–(中心(x,y),(宽度、高度)、旋转角度)。
(center(x,y), (width, height), angle of rotation) = cv2.minAreaRect(points)
但是要绘制一个矩形,我们需要矩形的四个角,因此为了将Box2D结构转换为4个角点,OpenCV提供了另一个函数cv2.boxPoints(),这将Box2D结构作为输入并返回4个角点。4个角点从y最高的点开始按顺时针顺序排列。语法如下:
points = cv2.boxPoints(box)
在绘制矩形之前,需要将4个角点转换为整数类型。可以使用np.int32或者np.int64(不要使用np.int8,因为它允许最大值127并截断)。有时,你可能会看到使用了np.int0,不要混淆,这相当于np.int32或者np.int64,具体取决于你的系统结构。完整的代码如下:
rect = CV2.minAreaRect(cnt)
box = cv2.boxPoints(rect)
box = np.int0(box)
得到四个坐标后,就可以轻松绘制图形了。现在,让我们讨论一下旋转角度。
2.旋转角度
获得四个角点以后,这四个角点从具有最高y的点开始按顺时针顺序排列,如下所示。如果2个点具有相同的最高y,则最右的点是起点。这些点被编号为0,1,2,3(0开始,3结束)。
因此,OpenCV的cv2.minAreaRect()给出的旋转角度实际上是直线(连接起点和终点)与水平线之间的角度,如下所示。
因此角度值始终位于[-90, 0)之间。为什么?因为如果对象旋转超过90°,则使用下一条边来计算与水平面的角度。因此计算出的角度始终位于[-90,0)之间。
实际角度是对象旋转的角度,计算出的角度是cv.minAreaRect()返回的角度。
补充:cv2.minAreaRect输出旋转角度测试
函数使用方法
min_rect = cv2.minAreaRect(cnt)
# 输入参数cnt是通过findContours识别出来的轮廓信息
# 输出min_rect是一个元组,其中的结构是最小外接矩形的(中心(x,y),(边1长度,边2长度),旋转角度)
简单测试一下对几个角度的矩形和平行四边形的识别效果
图片可能较小,建议放大观看
可以看到,输出的旋转角度和矩形边2的选择有关,具体函数是按照什么规则来确定边1和边2,我还不清楚,但是根据上面的实验结论,大致可以推测出以下规律:
规定水平矩阵为上图第一个矩形形状,即长边平行于x轴,短边垂直于x轴,
按住水平矩形的左上角,逆时针旋转矩形不超过90度 形成的矩形,长边作为边2;
按住水平矩形的左上角,顺时针旋转矩形小于90度 形成的矩形,短边作为边2。
参考目录
https://theailearner.com/tag/cv2-minarearect/
来源:https://blog.csdn.net/weixin_43229348/article/details/125986969
猜你喜欢
- 机器A: select instance_name from v$instance; select name from v$database
- 依赖模块xlwt下载:pip install xlwt后台模块view.py# 导出Excel文件def export_excel(requ
- 本文实例为大家分享了python之pygame模块实现飞机大战的具体代码,供大家参考,具体内容如下Python飞机大战步骤:1.数据区2.主
- 距上篇关于淘宝抢购源码的文章已经过去五个月了,五个月来我通过不停的学习,掌握了更深层的抢购技术及原理,而上篇文章中我仅分享了关于加入购物车的
- 一、策略模式策略模式中,首先定义了一系列不同的算法,并把它们一一封装起来,然后在策略类中,使这些算法可以相互替换。这意味着,让一个类的行为(
- 方法一:在目前绝大部分数据库有分布式查询的需要。下面简单的介绍如何在oracle中配置实现跨库访问。比如现在有2个数据库服务器,安装了2个数
- 本文主要讲述的是对Python中property属性(特性)的理解,具体如下。定义及作用:在property类中,有三个成员方法和三个装饰器
- 寻觅工具确定任务之后第一步就是找个趁手的库来干活。 Python Excel上列出了xlrd、xlwt、xlutils这几个包,但是它们都比
- 本文给大家分享了好几种复制表结构、表数据的示例介绍,具体详情请看下文吧。1、复制表结构及数据到新表CREATE TABLE 新表SELECT
- 将.py文件转化为.exe文件首先需要第三方库 pyinstaller1.如果没有安装pyinstaller,则在命令提示符输入 pip i
- 中国,美国,英国3国时间js同步动态显示,对于做企业网站的朋友相信用的到,特别是做英文网站的朋友,加上这一段代码会给你的网站增色不少!本文j
- 本文为Django项目创建的简单介绍,更为详细的Django项目创建,可以参考如下教程:Django入门与实践-https://www.jb
- 以下的文章主要介绍的是SQL Serve数据库到DB2连接服务器的实现过程,我们大家都知道不同数据库平台的互连,一般对其称之为数据库的异构服
- 1.将 JSON 转换为 CSVimport jsonif __name__ == '__main__': &
- 可以直接跳到最后整体代码看一看是不是很少的代码!!!!思路:1. 数据的整合2. 图片的灰度转化3. 图片的二值转化4. 图片的轮廓识别5.
- 引言在 Python 中,输入和输出格式化是一项重要的技能,它可以帮助你更好地与用户进行交互,以及更有效地展示数据。本节将介绍如何使用字符串
- 在Python2中datetime对象没有timestamp方法,不能很方便的生成epoch,现有方法没有处理很容易导致错误。关于Epoch
- 背景最近用uni-app开发小程序项目时,部分需要持久化的内容没法像其他vuex中的state那样调用,所以想着自己实现一下类似vuex-p
- 近些时间在开始学MySQL,安装挺顺利的,按照网上现成的教程就能安装成功。但是,在输入mysql -uroot -p再输入密码时,遇到了这个
- python map函数map()函数map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依