Python OpenCV中cv2.minAreaRect实例解析

作者:求则得之,舍则失之 时间:2022-09-02 19:36:58 

在这个文章中,我们将学习如何在感兴趣区域周围画最小面积矩形框。

1.最小面积矩形框

下图显示了两个矩形框,绿色的是普通矩形框,红色的是最小面积矩形框。可以发现,红色的是旋转矩形。

Python OpenCV中cv2.minAreaRect实例解析

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结束)。

Python OpenCV中cv2.minAreaRect实例解析

因此,OpenCV的cv2.minAreaRect()给出的旋转角度实际上是直线(连接起点和终点)与水平线之间的角度,如下所示。

Python OpenCV中cv2.minAreaRect实例解析

因此角度值始终位于[-90, 0)之间。为什么?因为如果对象旋转超过90°,则使用下一条边来计算与水平面的角度。因此计算出的角度始终位于[-90,0)之间。

Python OpenCV中cv2.minAreaRect实例解析

实际角度是对象旋转的角度,计算出的角度是cv.minAreaRect()返回的角度。

补充:cv2.minAreaRect输出旋转角度测试

函数使用方法

min_rect = cv2.minAreaRect(cnt)  
# 输入参数cnt是通过findContours识别出来的轮廓信息
# 输出min_rect是一个元组,其中的结构是最小外接矩形的(中心(x,y),(边1长度,边2长度),旋转角度)

简单测试一下对几个角度的矩形和平行四边形的识别效果

图片可能较小,建议放大观看

Python OpenCV中cv2.minAreaRect实例解析

可以看到,输出的旋转角度和矩形边2的选择有关,具体函数是按照什么规则来确定边1和边2,我还不清楚,但是根据上面的实验结论,大致可以推测出以下规律:

  • 规定水平矩阵为上图第一个矩形形状,即长边平行于x轴,短边垂直于x轴,

  • 按住水平矩形的左上角,逆时针旋转矩形不超过90度 形成的矩形,长边作为边2;

  • 按住水平矩形的左上角,顺时针旋转矩形小于90度 形成的矩形,短边作为边2。

参考目录

https://theailearner.com/tag/cv2-minarearect/

来源:https://blog.csdn.net/weixin_43229348/article/details/125986969

标签:cv2.minAreaRect,opencv
0
投稿

猜你喜欢

  • 从网页设计开始

    2008-06-30 12:17:00
  • 详解微信小程序图片地扯转base64解决方案

    2024-06-18 05:52:55
  • python爬虫-模拟微博登录功能

    2021-12-13 21:54:08
  • Python定义一个函数的方法

    2023-09-18 17:28:09
  • python 3利用BeautifulSoup抓取div标签的方法示例

    2023-09-17 02:57:48
  • JavaScript常用的返回,自动跳转,刷新,关闭语句汇总

    2023-10-21 10:37:27
  • Golang 手写一个简单的并发任务 manager

    2024-02-21 00:15:31
  • python 中的列表解析和生成表达式

    2022-01-30 16:14:15
  • html静态页面调用php文件的方法

    2023-09-04 23:18:21
  • JavaScript实现前端倒计时效果

    2024-06-05 09:34:10
  • 解决pandas无法在pycharm中使用plot()方法显示图像的问题

    2021-06-02 21:23:14
  • python开发一款翻译工具

    2022-01-19 07:28:43
  • 如何用Matplotlib 画三维图的示例代码

    2023-03-02 15:16:08
  • Python Pygame实战之红心大战游戏的实现

    2023-08-23 02:28:08
  • pyqt5中动画的使用详解

    2023-06-29 19:31:51
  • python实现学生信息管理系统(面向对象)

    2022-06-13 16:16:07
  • 属性与 @property 方法让你的python更高效

    2023-02-02 08:20:18
  • sql无效字符 执行sql语句报错解决方案

    2024-01-13 01:40:26
  • 数据库中聚簇索引与非聚簇索引的区别[图文]

    2012-02-25 19:38:23
  • 深入了解Python Opencv数据增强

    2023-10-27 05:00:01
  • asp之家 网络编程 m.aspxhome.com