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

OpenCV结构分析与形状描述符(17)判断轮廓是否为凸多边形的函数isContourConvex()的使用

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

算法描述

测试轮廓的凸性。
该函数测试输入的轮廓是否为凸的。轮廓必须是简单的,即没有自相交。否则,函数的输出是不确定的。

cv::isContourConvex 函数是 OpenCV 提供的一个用于判断轮廓是否为凸多边形的函数。这个函数可以用来验证一个给定的轮廓是否是凸的,这对于后续处理(如使用 intersectConvexConvex 来寻找两个凸多边形的交集)是非常有用的。

函数原型

bool cv::isContourConvex	
(InputArray 	contour
)	

参数

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

代码示例


#include <iostream>
#include <opencv2/opencv.hpp>int main()
{// 定义两个矩形的顶点cv::Mat p1 = ( cv::Mat_< float >( 4, 2 ) << 0, 0,  // 左上角2, 0,                               // 右上角2, 2,                               // 右下角0, 2 );                             // 左下角cv::Mat p2 = ( cv::Mat_< float >( 4, 2 ) << 1, 1,  // 左上角3, 1,                               // 右上角3, 3,                               // 右下角1, 3 );                             // 左下角// 验证轮廓是否为凸多边形bool isP1Convex = cv::isContourConvex( p1 );bool isP2Convex = cv::isContourConvex( p2 );std::cout << "Polygon p1 is convex: " << std::boolalpha << isP1Convex << std::endl;std::cout << "Polygon p2 is convex: " << std::boolalpha << isP2Convex << std::endl;// 如果两个多边形都是凸的,才继续进行交集计算if ( isP1Convex && isP2Convex ){cv::Mat p12;bool intersect = cv::intersectConvexConvex( p1, p2, p12, true );if ( intersect ){std::cout << "Polygons intersect." << std::endl;std::cout << "Intersection vertices:" << std::endl;for ( int i = 0; i < p12.rows; ++i ){cv::Point2f pt = p12.at< cv::Point2f >( i );std::cout << "Vertex " << i << ": (" << pt.x << ", " << pt.y << ")" << std::endl;}}else{std::cout << "Polygons do not intersect." << std::endl;}}else{std::cout << "One or both polygons are not convex." << std::endl;}return 0;
}

运行结果

Polygon p1 is convex: true
Polygon p2 is convex: true
Polygons intersect.
Intersection vertices:
Vertex 0: (2, 1)
Vertex 1: (2, 2)
Vertex 2: (1, 2)
Vertex 3: (1, 1)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 监控易监测对象及指标之:全面监控Oracle数据库
  • cartographer从入门到精通(一):cartographer介绍
  • java八股!5(线程创建+并发容器+线程锁)
  • [网络原理]关于网络的基本概念 及 协议
  • 郑州建筑智能化乙级资质申请,人员资质要求详解
  • NLP-文本分类文献阅读-前置基础-词汇解释-通俗易懂-9月份-学习总结
  • 如何将 Electron 项目上架 Apple Store
  • JDBC API详解二
  • 基于SSM和VUE的药品管理系统(含源码+sql+视频导入教程+文档)
  • 解锁全球机遇:澳大利亚服务器租用市场的独特魅力
  • 音视频入门基础:WAV专题(9)——FFmpeg源码中计算WAV音频文件每个packet的duration和duration_time的实现
  • 网络原理(3)—— 应用层、传输层(TCP)
  • Redis 是否存在线程安全问题:深入解析与技术分析
  • Robust Image Denoising through Adversarial Frequency Mixup
  • “他人笑我太疯癫,我笑他人看不穿“,关于做知识分享,被Diss,哇哦,真厉害
  • AngularJS指令开发(1)——参数详解
  • Apache Spark Streaming 使用实例
  • C++入门教程(10):for 语句
  • Fundebug计费标准解释:事件数是如何定义的?
  • JavaScript 一些 DOM 的知识点
  • Js基础知识(四) - js运行原理与机制
  • socket.io+express实现聊天室的思考(三)
  • windows下使用nginx调试简介
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 翻译:Hystrix - How To Use
  • 关于使用markdown的方法(引自CSDN教程)
  • 基于web的全景—— Pannellum小试
  • 前端面试之闭包
  • 入手阿里云新服务器的部署NODE
  • 时间复杂度与空间复杂度分析
  • 我有几个粽子,和一个故事
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 项目管理碎碎念系列之一:干系人管理
  • 小程序开发之路(一)
  • 最简单的无缝轮播
  • ######## golang各章节终篇索引 ########
  • #13 yum、编译安装与sed命令的使用
  • #pragma multi_compile #pragma shader_feature
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (LLM) 很笨
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (SpringBoot)第二章:Spring创建和使用
  • (二十三)Flask之高频面试点
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (正则)提取页面里的img标签
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (自用)网络编程
  • **CI中自动类加载的用法总结
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .htaccess配置常用技巧
  • .Net Core 中间件验签
  • .Net Remoting(分离服务程序实现) - Part.3
  • .NET 跨平台图形库 SkiaSharp 基础应用