OpenCV结构分析与形状描述符(21)计算包围给定点集的最小面积三角形函数minEnclosingTriangle()的使用

embedded/2024/9/23 15:16:14/
  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

找到一个包围二维点集的最小面积三角形,并返回其面积。

该函数找到一个包围给定的二维点集的最小面积三角形,并返回其面积。给定的二维点集的输出结果如下面的图所示。二维点用红色表示,包围的三角形用黄色表示:
在这里插入图片描述
该算法的实现基于 O’Rourke 的 206和 Klee 与 Laskowski 的 144论文。O’Rourke 提供了一个 θ(n) 的算法来寻找具有 n 个顶点的二维凸多边形的最小包围三角形。由于 minEnclosingTriangle 函数接收一个二维点集作为输入,因此需要一个额外的预处理步骤来计算该二维点集的凸包。凸包(convexHull)函数的时间复杂度是 O(nlog(n)),这比 θ(n) 要高。因此,该函数的总体复杂度是 O(nlog(n))

函数原型

double cv::minEnclosingTriangle	
(InputArray 	points,OutputArray 	triangle 
)		

参数

  • 参数points 输入的二维点向量,深度为 CV_32S 或 CV_32F,存储在 std::vector<> 或 Mat 中。
  • 参数triangle 输出的三维点向量,定义三角形的三个顶点。OutputArray 的深度必须为 CV_32F。

返回值

返回的是三角形的面积

代码示例


#include <iostream>
#include <opencv2/opencv.hpp>
#include <vector>int main()
{// 创建一个空白的图像cv::Mat image = cv::Mat::zeros( 300, 300, CV_8UC3 );// 构造一个包含多个点的向量std::vector< cv::Point2f > points;points.push_back( cv::Point2f( 100, 100 ) );points.push_back( cv::Point2f( 150, 90 ) );points.push_back( cv::Point2f( 150, 140 ) );points.push_back( cv::Point2f( 200, 100 ) );points.push_back( cv::Point2f( 150, 150 ) );points.push_back( cv::Point2f( 160, 155 ) );points.push_back( cv::Point2f( 100, 200 ) );points.push_back( cv::Point2f( 200, 200 ) );// 定义输出变量std::vector< cv::Point2f > triangle;// 计算最小面积三角形cv::minEnclosingTriangle( points, triangle );// 计算三角形的面积float area = cv::contourArea( triangle );// 绘制点集for ( const auto& pt : points ){cv::circle( image, pt, 3, cv::Scalar( 0, 0, 255 ), -1 );  // 绘制红色的小圆圈表示点}// 将 Point2f 转换为 Pointstd::vector< cv::Point > triangleInt;for ( const auto& pt : triangle ){triangleInt.push_back( cv::Point( static_cast< int >( pt.x ), static_cast< int >( pt.y ) ) );}// 将单个点向量转换为 polylines 所需的向量的向量形式std::vector< std::vector< cv::Point > > allTriangles;allTriangles.push_back( triangleInt );// 绘制最小面积三角形if ( triangle.size() == 3 ){cv::polylines( image, allTriangles, true, cv::Scalar( 0, 255, 255 ), 2 );  // 绘制黄色的三角形}// 显示图像cv::imshow( "Min Enclosing Triangle", image );cv::waitKey( 0 );// 输出三角形的面积std::cout << "Area of the enclosing triangle: " << area << std::endl;return 0;
}

运行结果

在这里插入图片描述


http://www.ppmy.cn/embedded/112827.html

相关文章

区块链学习笔记3--以太坊

智能合约&#xff1a;跑在以太坊系统中的代码合同&#xff0c;其实质是一段代码。目前已经存在180多万个智能合约。 智能合约能表达&#xff1a;规则明确&#xff0c;不受主观因素影响的业务。 智能合约能表达&#xff1a;规则不轻易修改的业务 如果业务的规则经常变化&#x…

【计算机网络】UDP 协议详解及其网络编程应用

文章目录 一、引言二、UDP1、UDP的协议格式2、UDP 报文的解包和分用3、UDP面向数据报的特点 三、UDP输入输出四、UDP网络编程 一、引言 UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;是一种网络通信协议&#xff0c;它属于传输层的协议。是一…

PHP环境搭建教程

在现代web开发中&#xff0c;PHP是一种广泛使用的服务器端脚本语言&#xff0c;适用于动态网页的创建。在本文中&#xff0c;我们将详细介绍如何在Windows和Linux环境中搭建PHP开发环境&#xff0c;帮助你快速开始PHP编程之旅。 一、准备工作 在开始搭建环境之前&#xff0c;…

Java读取损坏的xls表格

Java读取损坏的xls表格 1. 损坏的文件1.1 正常的xls文件用360解压后是这样↓1.2 被损坏的xls文件用360解压后是这样↓ 2. Java代码读取Excel文件分析2.1 使用EasyExcel读取损坏的xls文件报错2.2 使用POI读取损坏的xls文件报错 3. 损坏文件修复方案4. 代码 由于不可抗原因在网站…

运维工程师面试整理-操作系统

在运维工程师的面试中,操作系统相关的知识通常是重中之重,尤其是Linux/Unix系统。以下是针对操作系统部分的一些详细内容,帮助你更好地准备面试。 1. Linux/Unix 基础 ● 常用命令 ○ 文件和目录管理:ls, cd, cp, mv, rm, mkdir, rmdir, find, grep, awk, sed

收购芯片设计公司Annapurna Labs后

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

2024/9/16 pytorch

一、pytorch两大法宝元素 假设有一个名为pytorch的包 dir()&#xff1a;用于打开包&#xff0c;看里面的内容 help():用于查看具体的内容的用处 二、python文件&#xff0c;python控制台和jupyter的使用对比 三、pytorch读取数据 pytorch读取数据主要涉及到两个类&#xff1…

面试题总结(三) -- 内存管理篇

面试题总结(三) – 内存管理篇 文章目录 面试题总结(三) -- 内存管理篇<1> C 中堆内存和栈内存的区别是什么&#xff1f;<2> 如何在 C 中手动管理内存&#xff08;new/delete 操作符&#xff09;&#xff1f;<3> C 中内存泄漏的原因和避免方法<4> 谈谈…