OpenCV如何为等值线创建边界旋转框和椭圆(63)

2024-05-02 05:52

本文主要是介绍OpenCV如何为等值线创建边界旋转框和椭圆(63),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 返回:OpenCV系列文章目录(持续更新中......)

上一篇:OpenCV 为轮廓创建边界框和圆(62)
下一篇:OpenCV的图像矩(64)

目标

在本教程中,您将学习如何:

cv::minAreaRect 和 cv::fitEllipse 都是 OpenCV 库中常用的图像处理函数,主要用于图像分析和形状检测等操作。

cv::minAreaRect 是一个用于计算轮廓最小外接矩形的函数,它可以计算由轮廓点定义的最小矩形。该函数的主要思路是,在轮廓点集中寻找包含所有点的最小矩形,然后返回该矩形的中心坐标、宽度、高度和旋转角度等信息。通过 minAreaRect 函数,我们可以实现轮廓的最小外接矩形计算和绘制操作,从而更加准确地描述轮廓的形状和方向。

cv::fitEllipse 则是一个用于拟合轮廓为椭圆的函数,它可以计算一个最小二乘椭圆来拟合轮廓所有点。该函数的主要思路是,在轮廓点集中寻找最小二乘椭圆,然后返回该椭圆的中心坐标、长短轴长度和旋转角度等信息。通过 fitEllipse 函数,我们可以实现拟合椭圆和绘制椭圆操作,并利用椭圆的特征对轮廓进行更加精确的形状和方向分析。

cv::minAreaRect 和 cv::fitEllipse 通常会一起使用。它们可以应用于图像处理、形状分析、轮廓检测等领域。通过 minAreaRect 函数计算轮廓的最小外接矩形,我们可以确定轮廓的矩形区域,从而实现轮廓的定位和绘制操作;通过 fitEllipse 函数拟合轮廓的椭圆,我们可以确定轮廓的椭圆区域,并计算出椭圆的特征,从而实现更加精确的轮廓分析和检测。 

C++代码
 

本教程代码如下所示。您也可以从这里下载

#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>using namespace cv;
using namespace std;Mat src_gray;
int thresh = 100;
RNG rng(12345);void thresh_callback(int, void* );int main( int argc, char** argv )
{CommandLineParser parser( argc, argv, "{@input | stuff.jpg | input image}" );Mat src = imread( samples::findFile( parser.get<String>( "@input" ) ) );if( src.empty() ){cout << "Could not open or find the image!\n" << endl;cout << "Usage: " << argv[0] << " <Input image>" << endl;return -1;}cvtColor( src, src_gray, COLOR_BGR2GRAY );blur( src_gray, src_gray, Size(3,3) );const char* source_window = "Source";namedWindow( source_window );imshow( source_window, src );const int max_thresh = 255;createTrackbar( "Canny thresh:", source_window, &thresh, max_thresh, thresh_callback );thresh_callback( 0, 0 );waitKey();return 0;
}void thresh_callback(int, void* )
{Mat canny_output;Canny( src_gray, canny_output, thresh, thresh*2 );vector<vector<Point> > contours;findContours( canny_output, contours, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0) );vector<RotatedRect> minRect( contours.size() );vector<RotatedRect> minEllipse( contours.size() );for( size_t i = 0; i < contours.size(); i++ ){minRect[i] = minAreaRect( contours[i] );if( contours[i].size() > 5 ){minEllipse[i] = fitEllipse( contours[i] );}}Mat drawing = Mat::zeros( canny_output.size(), CV_8UC3 );for( size_t i = 0; i< contours.size(); i++ ){Scalar color = Scalar( rng.uniform(0, 256), rng.uniform(0,256), rng.uniform(0,256) );// contourdrawContours( drawing, contours, (int)i, color );// ellipseellipse( drawing, minEllipse[i], color, 2 );// rotated rectanglePoint2f rect_points[4];minRect[i].points( rect_points );for ( int j = 0; j < 4; j++ ){line( drawing, rect_points[j], rect_points[(j+1)%4], color );}}imshow( "Contours", drawing );
}

结果

参考文献:

1、《Creating Bounding boxes and circles for contours》------Ana Huamán

这篇关于OpenCV如何为等值线创建边界旋转框和椭圆(63)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/953508

相关文章

Spring创建Bean的八种主要方式详解

《Spring创建Bean的八种主要方式详解》Spring(尤其是SpringBoot)提供了多种方式来让容器创建和管理Bean,@Component、@Configuration+@Bean、@En... 目录引言一、Spring 创建 Bean 的 8 种主要方式1. @Component 及其衍生注解

MySQL 数据库表操作完全指南:创建、读取、更新与删除实战

《MySQL数据库表操作完全指南:创建、读取、更新与删除实战》本文系统讲解MySQL表的增删查改(CURD)操作,涵盖创建、更新、查询、删除及插入查询结果,也是贯穿各类项目开发全流程的基础数据交互原... 目录mysql系列前言一、Create(创建)并插入数据1.1 单行数据 + 全列插入1.2 多行数据

MySQL 临时表创建与使用详细说明

《MySQL临时表创建与使用详细说明》MySQL临时表是存储在内存或磁盘的临时数据表,会话结束时自动销毁,适合存储中间计算结果或临时数据集,其名称以#开头(如#TempTable),本文给大家介绍M... 目录mysql 临时表详细说明1.定义2.核心特性3.创建与使用4.典型应用场景5.生命周期管理6.注

MySQL的触发器全解析(创建、查看触发器)

《MySQL的触发器全解析(创建、查看触发器)》MySQL触发器是与表关联的存储程序,当INSERT/UPDATE/DELETE事件发生时自动执行,用于维护数据一致性、日志记录和校验,优点包括自动执行... 目录触发器的概念:创建触www.chinasem.cn发器:查看触发器:查看当前数据库的所有触发器的定

创建springBoot模块没有目录结构的解决方案

《创建springBoot模块没有目录结构的解决方案》2023版IntelliJIDEA创建模块时可能出现目录结构识别错误,导致文件显示异常,解决方法为选择模块后点击确认,重新校准项目结构设置,确保源... 目录创建spChina编程ringBoot模块没有目录结构解决方案总结创建springBoot模块没有目录

OpenCV在Java中的完整集成指南分享

《OpenCV在Java中的完整集成指南分享》本文详解了在Java中集成OpenCV的方法,涵盖jar包导入、dll配置、JNI路径设置及跨平台兼容性处理,提供了图像处理、特征检测、实时视频分析等应用... 目录1. OpenCV简介与应用领域1.1 OpenCV的诞生与发展1.2 OpenCV的应用领域2

在Java中使用OpenCV实践

《在Java中使用OpenCV实践》用户分享了在Java项目中集成OpenCV4.10.0的实践经验,涵盖库简介、Windows安装、依赖配置及灰度图测试,强调其在图像处理领域的多功能性,并计划后续探... 目录前言一 、OpenCV1.简介2.下载与安装3.目录说明二、在Java项目中使用三 、测试1.测

IntelliJ IDEA2025创建SpringBoot项目的实现步骤

《IntelliJIDEA2025创建SpringBoot项目的实现步骤》本文主要介绍了IntelliJIDEA2025创建SpringBoot项目的实现步骤,文中通过示例代码介绍的非常详细,对大家... 目录一、创建 Spring Boot 项目1. 新建项目2. 基础配置3. 选择依赖4. 生成项目5.

Linux线程之线程的创建、属性、回收、退出、取消方式

《Linux线程之线程的创建、属性、回收、退出、取消方式》文章总结了线程管理核心知识:线程号唯一、创建方式、属性设置(如分离状态与栈大小)、回收机制(join/detach)、退出方法(返回/pthr... 目录1. 线程号2. 线程的创建3. 线程属性4. 线程的回收5. 线程的退出6. 线程的取消7.

创建Java keystore文件的完整指南及详细步骤

《创建Javakeystore文件的完整指南及详细步骤》本文详解Java中keystore的创建与配置,涵盖私钥管理、自签名与CA证书生成、SSL/TLS应用,强调安全存储及验证机制,确保通信加密和... 目录1. 秘密键(私钥)的理解与管理私钥的定义与重要性私钥的管理策略私钥的生成与存储2. 证书的创建与