cv::convexityDefects异常

news2024/12/24 2:38:49

cv::convexityDefects捕捉到cv::Exception
OpenCV(4.8.0) C:\GHA-OCV-1\_work\ci-gha-workflow\ci-gha-workflow\opencv\modules\imgproc\src\convhull.cpp:360: error: (-5:Bad argument) The convex hull indices are not monotonous, which can be in the case when the input contour contains self-intersections in function 'cv::convexityDefects'

这是输入轮廓点集
在这里插入图片描述
通过cv::convexHull找到的凸包点索引
在这里插入图片描述
凸包点集
在这里插入图片描述
如图,蓝色为轮廓点连线,橙色数字为凸包点的序号
在这里插入图片描述
原因是self-intersection(自相交)的轮廓,opencv无法处理

针对这种情况,opencv会抛出异常,如果不做异常处理,会导致程序崩溃

见git上的Issue:Indices from convexHull not monotonic #4539
作者vpisarev提到了没有好的办法处理这种情况

the issue is mostly fixed. Without that 1 pixel-wide “hair” on the
contour, which can be made more thick or completely eliminated using
morphological operations, everything now works well. With this “hair”
an exception is now thrown by convexityDefects. For now I do not have
a good solution to produce a good convex hull for such a contour. It’s
not a problem of Sklansky algorithm, I believe, it’s that this
particular case can be considered as a contour with self-intersection.
A contour with self-intersection is basically not a contour, it’s
rather a generic point set, and for such a set it’s impossible to
generate a completely ordered convex hull. But at least such case is
now caught by convexityDetects instead of silently producing incorrect
results.

BTW, it’s said in several places that Sklansky algorithm is incorrect.
This is true, but only when we are talking about O(N) Sklansky
algorithm that computes convex hulls for polygons. OpenCV does not
have a function to compute convex hull for polygons. It computes
convex hull for unordered 2D point sets. The complexity is
O(N*log(N)), not O(N). And the Sklansky algorithm in OpenCV iterates
though the points in a certain sorted order, not in the original
order. So, the counter-examples, developed by Toussaint et al, are not
applicable to our implementation. I cannot claim, of course, that our
implementation is completely bug-free. I’m just saying that OpenCV
implementation does not have the same problem as the original
Skansky’82 O(N) algorithm

有的人说先对cv::convexHull输出的索引数组降序排列后再输入convexityDefects,貌似不会异常了,但这样做不符合原理

一些库里(如CGAL库、PostGIS库)里有自相交多边形(或平面)的判断和消除算法,一般思路是将自相交多边形分解为多个子形状,或者把孔洞填补了
PostGIS教程十五:几何图形的有效性
对于三角网格的自相交(self intersect)问题该如何解决?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1963184.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

拓扑排序(初中组)

有向无环图 定义 边有向,无环。英文名叫 Directed Acyclic Graph,缩写是 DAG。一些实际问题中的二元关系都可使用 DAG 来建模。 性质 能 拓扑排序 的图,一定是有向无环图; 如果有环,那么环上的任意两个节点在任意序…

特征构造和降维

特征构造(Feature Engineering) 特征构造是从现有数据中创建新的特征,以揭示数据中的隐藏关系,从而提高模型表现。这是数据预处理中一个关键步骤,可以显著提升模型的性能。 原理 通过特征构造,我们可以利…

“云计算环境下的等保测评要点分析“

随着云计算技术的广泛应用,企业越来越多地将业务迁移到云端,这不仅带来了灵活性和效率的提升,也对信息安全提出了新的挑战。等保测评作为我国信息安全等级保护制度的重要组成部分,其在云计算环境下的实施具有特殊性。本文将围绕“…

nginx 简单使用方法

nginx是用于 Web 服务、反向代理、内容缓存、负载均衡、媒体流传输等场景的开源软件。 主要作用有三个:1、反向代理 负载均衡动静分离 下载地址:nginx: download nginx执行命令及启动 //假设安装在E:\server\nginx-1.20.0目录下 //cmd命令进入安装文…

如何在 VitePress 中增加一个全局自定义组件

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storm…

【Python实战】轻松实现自动发送邮件

本文收录于 《一起学Python趣味编程》专栏,从零基础开始,分享一些Python编程知识,欢迎关注,谢谢! 文章目录 一、前言二、开发准备三、正式开始四、总结一、前言 本文介绍如何使用Python开源项目“PythonSendMail”,快速实现自动发送带Excel报表附件的邮件。只需要进行简…

操作系统篇--八股文学习第十天| 进程和线程之间有什么区别;并行和并发有什么区别;解释一下用户态和核心态,什么场景下,会发生内核态和用户态的切换?

进程和线程之间有什么区别 答: 进程是资源调度和分配的基本单位。 线程是程序执行的最小单位,线程是进程的子任务,是进程内的执行单元。 一个进程至少有一个线程,一个进程可以运行多个线程,这些线程共享同一块内存…

oracle rac-> rac配置adg避坑注意点

例如源主库db_name为aaa db_unique_name为aaa,实例名为aaa1,aaa2 ORACLE_SID为aaa1,aaa2 tnsnames.ora的服务名配置:aaa/dgaaa 则备库设置参考:db_name相同为aaa,db_unique_name不同为dgaaa,实例名为dgaaa1,dgaaa2…

【LeetCode】56. 区间合并

区间合并 题目描述: 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 示例 1: …

Oracle的一些脚本工具总结

一、操作系统性能 在linux 6 之后,建议使用dstat监控操作系统的各项指标。 使用方法: yum install dstat dstat -cdlrgmnpsy 二、we.sql https://download.csdn.net/download/zengxiangbo/89601165 详见文章关联附件。 Oracle脚本工具,查…

企业安全生产管理是否将成为新的朝阳产业?

这个答案我可以肯定的告诉你,是的! 首先朝阳产业是啥?朝阳产业指的是具有广阔发展前景、高成长性和创新性的产业。 但你也有可能不信我说的这句。因为在大多数人看来,安全生产管理这块儿,企业的关注度不多&#xff0…

Oracle Database 确认表空间大小的方法

Oracle Database 确认表空间大小的方法 sql: WITH object_size AS (SELECT segment_name,owner,segment_type,tablespace_name,SUM(bytes) total_bytesFROM dba_segmentsGROUP BY segment_name, owner, segment_type, tablespace_name ), table_size AS (SELECT segment_name …

【探索Linux】P.43(网络层 —— IP协议)

阅读导航 引言一、IP协议基本概念二、IP协议头格式三、网段划分1. 网络号和主机号2. 引入子网掩码(1)基本概念(2)默认子网掩码(3)子网掩码的作用(4)子网掩码与IP地址的结合&#xff…

探索Python代码质量的守护神:Flake8

文章目录 探索Python代码质量的守护神:Flake8背景:为何选择Flake8?简介:Flake8是什么?安装:如何获取Flake8?使用方法:Flake8的基本命令场景应用:Flake8在实际开发中的作用…

SOMEIPSRV_RPC_13: 不同服务可以共享相同的端口

测试目的: 验证不同的服务是否能够共享同一个传输层协议的端口号。 描述 本测试用例旨在验证在同一个电子控制单元(ECU)上,不同服务的多个服务实例是否能够监听不同的端口,同时确保不同的服务能够共享同一个端口号。 测试拓扑&#xff1a…

接口测试:使用 curl 发送请求

简介 cURL 是一个通过 URL 传输数据的,功能强大的命令行工具。cURL 可以与 Chrome Devtool 工具配合使用,把浏览器发送的真实请求还原出来,附带认证信息,脱离浏览器执行,方便开发者重放请求、修改参数调试,…

SAP HCM 薪酬过账-忽略成本分配的含义

导读 INTRODUCTION 忽略成本分配:昨天分析C0表与C1表的作用,是为今天说的忽略成本分配按钮的铺垫,忽略成本分配这个翻译有点难让人理解,从字母意思感觉就是所有成本类的不拆分处相关的行项目,但是实际不是这样&#xf…

大数据-56 Kafka SpringBoot与Kafka 基础简单配置和使用

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

ALB快速实现IPv4服务的负载均衡

阿里云应用型负载均衡ALB支持HTTP、HTTPS和QUIC协议,专门面向网络应用层,提供强大的业务处理能力。 为了实现IPv4服务的负载均衡,需要快速创建一个ALB实例,并将来自客户端的访问请求转发至后端服务器。 操作流程 第一步&#x…

多语言 AI 翻译 API 数据接口

AI / 翻译 基于 AI 多语言模型 支持多语言 / 基于模型。 1. 产品功能 基于自有专业模型进行 AI 多语言翻译高效的文本翻译性能全接口支持 HTTPS(TLS v1.0 / v1.1 / v1.2 / v1.3);全面兼容 Apple ATS;全国多节点 CDN 部署&#xf…