当前位置: 首页 > news >正文

OpenCV结构分析与形状描述符(19)查找二维点集的最小面积外接旋转矩形函数minAreaRect()的使用

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

找到一个包围输入的二维点集的最小面积旋转矩形。

该函数计算并返回指定点集的最小面积边界矩形(可能是旋转的)。开发者需要注意的是,当数据接近包含的 Mat 元素边界时,返回的 RotatedRect 可能会包含负索引。

minAreaRect 是 OpenCV 库中的一个函数,它用于查找一个给定的二维点集(通常是一个轮廓)的最小面积外接旋转矩形。这个矩形不同于标准的最小包围盒(即由 cv::boundingRect 得到的直立矩形),它可以旋转任意角度以适应轮廓的形状,从而达到最小面积的效果。
使用场景
minAreaRect 常用于物体识别与定位,特别是在需要处理旋转情况下的物体检测时。它可以帮助你找到一个物体的精确位置和方向,这对于机器人视觉、工业检测等领域特别有用。

函数原型

RotatedRect cv::minAreaRect	
(InputArray 	points
)	

参数

  • 参数points 输入的二维点向量,存储在 std::vector<> 或 Mat 中。

返回值

  • RotatedRect: 返回的是一个 RotatedRect 对象,它包含了最小外接矩形的信息。RotatedRect 包括三个属性:
    • center (矩形的中心点坐标)
    • size (矩形的宽度和高度)
    • angle (矩形的旋转角度)

代码示例

#include <iostream>
#include <opencv2/opencv.hpp>
#include <vector>using namespace cv;
int main()
{// 创建一个空白图像Mat img( 400, 400, CV_8UC3, Scalar( 255, 255, 255 ) );std::vector< cv::Point2f > points;points.push_back( Point2f( 100, 100 ) );points.push_back( Point2f( 125, 125 ) );points.push_back( Point2f( 75, 125 ) );points.push_back( Point2f( 50, 150 ) );points.push_back( Point2f( 150, 150 ) );points.push_back( Point2f( 200, 250 ) );points.push_back( Point2f( 100, 250 ) );points.push_back( Point2f( 150, 300 ) );points.push_back( Point2f( 125, 275 ) );points.push_back( Point2f( 175, 275 ) );// 绘制原始点for ( const auto& pt : points ){circle( img, pt, 5, Scalar( 0, 255, 0 ), -1 );}// 获取最小面积外接矩形cv::RotatedRect rect = cv::minAreaRect( points );// 绘制最小面积外接矩形cv::Point2f vertices[ 4 ];rect.points( vertices );for ( int i = 0; i < 4; ++i ){cv::line( img, vertices[ i ], vertices[ ( i + 1 ) % 4 ], cv::Scalar( 0, 255, 0 ), 2 );}// 显示图像cv::imshow( "Image with Min Area Rect", img );cv::waitKey( 0 );return 0;
}

运行结果

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 数据库系统概论笔记(持续更新)
  • 控价中数据清洗有什么创新方法
  • 10款企业图纸加密软件大盘点|2024企业图纸加密软件推荐
  • adb的安装和使用 以及安装Frida 16.0.10+雷电模拟器
  • 亚马逊、沃尔玛、敦煌网、Target塔吉特、Temu环境搭建测评技术!
  • ctfshow-PHP反序列化
  • 【PCB工艺】如何实现PCB板层间的互连
  • Redis面试题整理
  • spring 框架过滤器和拦截器的差别
  • 基于STM32单片机的太阳能自动跟踪控制系统
  • springBoot 集成https
  • 服装|基于Java+vue的服装定制系统(源码+数据库+文档)
  • SpringBoot2:请求处理原理分析-利用内容协商功能实现接口的两种数据格式(JSON、XML)
  • shutil模块详解
  • 「豆包 Marscode 体验官」AI 加持的云端 IDE——三种方法高效开发前后端聊天交互功能
  • 【刷算法】求1+2+3+...+n
  • 0x05 Python数据分析,Anaconda八斩刀
  • javascript从右向左截取指定位数字符的3种方法
  • react 代码优化(一) ——事件处理
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • 多线程 start 和 run 方法到底有什么区别?
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 推荐一个React的管理后台框架
  • 一些css基础学习笔记
  • 在weex里面使用chart图表
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • ###项目技术发展史
  • #Linux(Source Insight安装及工程建立)
  • (2)Java 简介
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (el-Transfer)操作(不使用 ts):Element-plus 中 Select 组件动态设置 options 值需求的解决过程
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (七)glDrawArry绘制
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (一一四)第九章编程练习
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • .NET C# 使用GDAL读取FileGDB要素类
  • .NET MAUI Sqlite程序应用-数据库配置(一)
  • .net遍历html中全部的中文,ASP.NET中遍历页面的所有button控件
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • [000-01-011].第2节:持久层方案的对比
  • [240527] 谷歌 CEO 承认 AI 编造虚假信息问题难解(此文使用 @gemini 命令二次创作)| ICQ 停止运作
  • [Android 13]Input系列--获取触摸窗口
  • [android] 切换界面的通用处理
  • [Android实例] 保持屏幕长亮的两种方法 [转]
  • [BZOJ1010] [HNOI2008] 玩具装箱toy (斜率优化)
  • [C++] C++11详解 (一)