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

相关文章

C#高效实现在Word文档中自动化创建图表的可视化方案

《C#高效实现在Word文档中自动化创建图表的可视化方案》本文将深入探讨如何利用C#,结合一款功能强大的第三方库,实现在Word文档中自动化创建图表,为你的数据呈现和报告生成提供一套实用且高效的解决方... 目录Word文档图表自动化:为什么选择C#?从零开始:C#实现Word文档图表的基本步骤深度优化:C

Python列表的创建与删除的操作指南

《Python列表的创建与删除的操作指南》列表(list)是Python中最常用、最灵活的内置数据结构之一,它支持动态扩容、混合类型、嵌套结构,几乎无处不在,但你真的会创建和删除列表吗,本文给大家介绍... 目录一、前言二、列表的创建方式1. 字面量语法(最常用)2. 使用list()构造器3. 列表推导式

JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)

《JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)》:本文主要介绍如何在IntelliJIDEA2020.1中创建和部署一个JavaWeb项目,包括创建项目、配置Tomcat服务... 目录简介:一、创建项目二、tomcat部署1、将tomcat解压在一个自己找得到路径2、在idea中添加

Java利用Spire.Doc for Java实现在模板的基础上创建Word文档

《Java利用Spire.DocforJava实现在模板的基础上创建Word文档》在日常开发中,我们经常需要根据特定数据动态生成Word文档,本文将深入探讨如何利用强大的Java库Spire.Do... 目录1. Spire.Doc for Java 库介绍与安装特点与优势Maven 依赖配置2. 通过替换

Python结合Free Spire.PDF for Python实现PDF页面旋转

《Python结合FreeSpire.PDFforPython实现PDF页面旋转》在日常办公或文档处理中,我们经常会遇到PDF页面方向错误的问题,本文将分享如何用Python结合FreeSpir... 目录基础实现:单页PDF精准旋转完整代码代码解析进阶操作:覆盖多场景旋转需求1. 旋转指定角度(90/27

java创建xls文件放到指定文件夹中实现方式

《java创建xls文件放到指定文件夹中实现方式》本文介绍了如何在Java中使用ApachePOI库创建和操作Excel文件,重点是如何创建一个XLS文件并将其放置到指定文件夹中... 目录Java创建XLS文件并放到指定文件夹中步骤一:引入依赖步骤二:创建XLS文件总结Java创建XLS文件并放到指定文件

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

Linux创建服务使用systemctl管理详解

《Linux创建服务使用systemctl管理详解》文章指导在Linux中创建systemd服务,设置文件权限为所有者读写、其他只读,重新加载配置,启动服务并检查状态,确保服务正常运行,关键步骤包括权... 目录创建服务 /usr/lib/systemd/system/设置服务文件权限:所有者读写js,其他

idea+spring boot创建项目的搭建全过程

《idea+springboot创建项目的搭建全过程》SpringBoot是Spring社区发布的一个开源项目,旨在帮助开发者快速并且更简单的构建项目,:本文主要介绍idea+springb... 目录一.idea四种搭建方式1.Javaidea命名规范2JavaWebTomcat的安装一.明确tomcat