OpenCV RotatedRect类中angle参数解析 C++

0.前言
本文主要探讨RotatedRect类angle的实际含义,为后续学者提供一定的参考。

1.官方手册
RotatedRect其一构造函数如下图(图1-1)所示。


在OpenCV图形坐标系中,水平方向向右为x轴正方向,垂直方向向下为y轴正方向,左上角为(0,0)点。
center表示矩形的中心坐标,size中包含了矩形的宽度和高度,angle是矩形顺时针方向的旋转角度。
图片来源地址:https://docs.opencv.org/4.6.0/db/dd6/classcv_1_1RotatedRect.html#aba20dfc8444fff72bd820b616f0297ee

2.angle含义探讨
笔者在学习该参数时参考了一些网络文献,在实际测试时发现实验结果与参考的文献结论有冲突,所以自行做了实验去探究angle的实际含义。

2.1实验设计
笔者从网络上文献中摘取了一幅图像,该图像如下(图2-1)所示。


图片来源连接:https://blog.csdn.net/mailzst1/article/details/83141632
对于图2-1,笔者做出了一些变动,将图2-1缩放到水平为400像素,保持原图像比例不变。得到四个矩阵角点坐标如下所示。

矩阵(1) 矩阵(2) 矩阵(3) 矩阵(4)
Point(43, 30) Point(233, 84) Point(100, 217) Point(264, 222)
Point(129, 30) Point(227, 39) Point(57, 205) Point(225, 145)
Point(129, 77) Point(312, 25) Point(81, 122) Point(265, 125)
Point(43, 77) Point(319, 70) Point(124, 135) Point(305, 201)

使用如下代码运行测试,从中发现规律。

点击查看代码
Mat mSrcImage(400, 400, CV_8UC3, Scalar(0, 0, 0));
int iTypeVal = 0;
vector<Point> vPoints;
void onTypeChange(int, void*)
{Mat mResult;mSrcImage.copyTo(mResult);if (iTypeVal == 0)//boundingRectO函数{Rect rRes=boundingRect(vPoints);rectangle(mResult, rRes, Scalar(0, 0, 255), 1);}else if (iTypeVal==1)//minAreaRectO函数{RotatedRect rrRes = minAreaRect(vPoints);Point2f pPoint[4];rrRes.points(pPoint);for (short a = 0; a < 4; ++a){line(mResult, pPoint[a], pPoint[(a + 1) % 4], Scalar(0, 0, 255), 1);}cout << rrRes.center << "," << rrRes.angle << endl;}else if (iTypeVal == 2)//minEnclosingCircJeO函数{Point2f pCenter;float fR;minEnclosingCircle(vPoints, pCenter, fR);circle(mResult, pCenter, fR, Scalar(0, 0, 255), 1);}else if (iTypeVal == 3)//fitEllipseO函数{RotatedRect rrEllipse = fitEllipse(vPoints);ellipse(mResult, rrEllipse, Scalar(0, 0, 255), 1);}else if(iTypeVal==4)//minEnclosingTriangle函数{vector<Point2f> vTriangle(3);minEnclosingTriangle(vPoints, vTriangle);for (short a = 0; a < 3; ++a){line(mResult, vTriangle[a], vTriangle[(a + 1) % 3], Scalar(0, 0, 255), 1);}}else//凸包{vector<Point> vHull;convexHull(vPoints, vHull, false, true);vector<vector<Point>> vvContours = { vHull };drawContours(mResult, vvContours, -1, Scalar(0, 0, 255), 1);}imshow("轮廓包围", mResult);
}
void openCVdemo::test_61()
{//四个矩阵vPoints.push_back(Point(43, 30));vPoints.push_back(Point(129, 30));vPoints.push_back(Point(129, 77));vPoints.push_back(Point(43, 77));//vPoints.push_back(Point(233, 84));//vPoints.push_back(Point(227, 39));//vPoints.push_back(Point(312, 25));//vPoints.push_back(Point(319, 70));//vPoints.push_back(Point(100, 217));//vPoints.push_back(Point(57, 205));//vPoints.push_back(Point(81, 122));//vPoints.push_back(Point(124, 135));//vPoints.push_back(Point(264, 222));//vPoints.push_back(Point(225, 145));//vPoints.push_back(Point(265, 125));//vPoints.push_back(Point(305, 201));for (Point& p : vPoints){circle(mSrcImage, p, 2, Scalar(255, 255, 255), -1, LineTypes::FILLED);}imshow("原图", mSrcImage);namedWindow("轮廓包围", WindowFlags::WINDOW_AUTOSIZE);createTrackbar("轮廓类型", "轮廓包围", &iTypeVal, 5, onTypeChange, nullptr);onTypeChange(0, nullptr);
}

2.2代码测试
分别测试每个矩阵的四个点,得到如下测试结果(图2-2)。

2.3规律探究
根据控制台输出的结果笔者绘制了下图(图2-3)。


上图标注了每个矩阵的angle值。不难看出,将图像x轴按顺时针方向旋转(旋转角度>0),旋转过程中遇到的第一个与旋转轴平行的边为L,angle的值是L与水平方向的夹角。具体示例如下图(图2-4)所示。

3.结语
本文是笔者探究的规律,若有误,请指正。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/722745.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

字节面试:CPU被打满了/CPU100%,如何处理?

文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 :《尼恩Java面试宝典》 持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备 免费赠送 :《尼恩技术圣经+高并发系列PDF》 ,帮你 实现技术自由,…

ResourceManager unable to find resou

哈喽,大家好,我是木头左,AI改变生活!一、问题描述 在使用Mybatis自定义模板引擎时,可能会遇到一些问题。本文将介绍一个常见的报错信息:org.apache.velocity.exception.ResourceManagerException: Unable to find resource。这个错误通常表示Velocity引擎无法找到指定的资…

科技巨头的裁员潮:AI转型的代价是同事?

哈喽,大家好,我是木头左,AI改变生活!随着2024年的到来,硅谷科技大厂裁员的消息如同潮水般涌来。谷歌、亚马逊甚至苹果公司,都传出了人员减员、部门关停的消息。对于硅谷大厂连绵不断的裁员,有分析指出,科技巨头竞争白热化,AI转型是一次成本巨大的押注,而这部分激增的…

免费公益Teamspeak3服务器(附服务器地址,可开私人频道)

服务器地址:ts.melonagua.icu 可开私人频道,q2424149926

Android studio实现图标方式展示信息(折线图等)时com.github.mikephil.charting.charts.LineChart标红

参考连接—— https://blog.csdn.net/m0_37919094/article/details/122416408去 https://gitcode.com/PhilJay/MPAndroidChart/overview?utm_source=csdn_github_accelerator&isLogin=1 下载MPAndroidChart的zip包,解压在Android studio中操作 file——》new——》import…

软件工程课程总结

这学期上的软件工程课程非常充实,学会很多东西,大二下我们主要学习的Android studio(手机端)的开发,手机端对我来说是一个全新的知识,刚开始接触觉得很难,我网上看了很多资料,很抽象,很多很杂,因为安卓的视频都很老,基本上都是2020年以前的,可能在不远的将来安卓也会…

Oracle静默安装

1.安装前准备 1.1.关闭防火墙和SELINUX systemctl stop firewalld systemctl disable firewalld sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config1.2.修改主机名 vi /etc/hostname1.3.添加hosts解析 vi /etc/hosts #-------------------------…

ch4 信息搜寻与最优信息决策

信息搜寻与最优信息决策重点贝叶斯信念 信息搜寻预期收益(大题)课程内容 了解信息决策的基本原理,重点掌握信息搜寻理论的分析框架及其在具体实践中的应用。(1)信息与一般决策过程(2)不确定性与信息离散分布(3)信息搜索模型(4)最优信息决策 信息与决策 noth…

scoop-软件包管理器

scoop scoop官网 https://scoop.sh/ 项目github地址 https://github.com/ScoopInstaller/Scoop 安装scoop Set-ExecutionPolicy RemoteSigned 修改脚本执行策略 Invoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expression 安装scoop安装软件gitscoop及buck…

计划任务执行批处理脚本,运行记录显示“上次运行结果(0x1)”

计划任务执行cmd脚本时,执行不成功,并且“上次运行结果(0x1)”。 解决方案: 任务启动的【操作】窗口,添加【起始于】属性,属性值是bat所在文件夹路径。

Attacking organizations with big scopes: from zero to hero -- by Hussein Daher

SRC意识:1.模仿与抄袭某个知识点,某个writeup,某个主题,某个赏猎报告等;2.对现网中所有实际SRC目标进行遍历;3.枯草且乏味的持之以恒的坚持前面的第1步与第2步。 错误的SRC意识:学了OWASP TOP 10和BP官网靶场的所有漏洞主题之后依旧在SRC方面没有表现出应该具备的自信心…

利用SpringBeanUtil 来获取 IOC 容器中的bean

有时候在代码中,不希望使用自动注入,而是手动获取Spring容器以及Spring容器中的某个对象 1、首先写一个class实现ApplicationContextAware#import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springfram…