OpenCV结构分析与形状描述符(9)检测轮廓相对于其凸包的凹陷缺陷函数convexityDefects()的使用
- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
查找一个轮廓的凸性缺陷。
下图显示了一个手部轮廓的凸性缺陷:
convexityDefects 是 OpenCV 库中的一个函数,用于检测轮廓相对于其凸包的凹陷缺陷。这个函数可以帮助识别轮廓中的凹进去的部分,通常被用来分析手部或其他物体的形状特征。
函数原型
void cv::convexityDefects
(InputArray contour,InputArray convexhull,OutputArray convexityDefects
)
参数
- 参数contour 输入的轮廓。
- 参数convexhull 使用 convexHull 获得的凸包,应包含构成凸包的轮廓点的索引。
- 参数convexityDefects 凸性缺陷的输出向量。在 C++ 和新的 Python/Java 接口中,每个凸性缺陷表示为一个四元素整数向量(即 Vec4i):(start_index, end_index, farthest_pt_index, fixpt_depth),其中索引是原始轮廓中凸性缺陷起始点、终点和最远点的 0 基础索引,而 fixpt_depth 是最远轮廓点与凸包之间距离的定点近似值(带有 8 位小数部分)。也就是说,要获得深度的浮点数值,需要将 fixpt_depth 除以 256.0。
代码示例
#include <iostream>
#include <opencv2/opencv.hpp>using namespace std;
using namespace cv;int main()
{// 加载一张图像Mat img = imread( "/media/dingxin/data/study/OpenCV/sources/images/hand2.png", IMREAD_GRAYSCALE );if ( img.empty() ){cerr << "Error: Image not found." << endl;return -1;}// 二值化处理Mat binImg;threshold( img, binImg, 48, 255, THRESH_BINARY_INV );//imshow( "er zhi", binImg );// 寻找轮廓vector< vector< Point > > contours;findContours( binImg, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE );// 假设我们只处理第一个最大的轮廓vector< Point > contour = contours[ 0 ];// 计算凸包vector< int > hull;convexHull( contour, hull );// 计算凹陷缺陷vector< Vec4i > defects;convexityDefects( contour, hull, defects );// 在原图上绘制凸包和凹陷缺陷Mat drawing = Mat::zeros( img.size(), CV_8UC3 );drawContours( drawing, contours, 0, Scalar( 255, 0, 0 ), 2 ); // 绘制轮廓//imshow( "Convexity ", drawing );// 绘制凹陷缺陷for ( size_t i = 0; i < defects.size(); i++ ){Vec4i defect = defects[ i ];Point start = contour[ defect[ 0 ] ];Point end = contour[ defect[ 1 ] ];Point farthest = contour[ defect[ 2 ] ];line( drawing, start, end, Scalar( 0, 255, 0 ), 1 ); // 绘制凹陷缺陷的边缘circle( drawing, farthest, 5, Scalar( 0, 0, 255 ), -1 ); // 绘制凹陷缺陷的最远点}// 显示结果imshow( "Original image", img );imshow( "Convexity Defects", drawing );waitKey( 0 );return 0;
}
运行结果
相关文章:

OpenCV结构分析与形状描述符(9)检测轮廓相对于其凸包的凹陷缺陷函数convexityDefects()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 查找一个轮廓的凸性缺陷。 下图显示了一个手部轮廓的凸性缺陷: convexityDefects 是 OpenCV 库中的一个函数,用于检测轮…...
HTTP 之 响应头信息(二十三)
应答头说明Allow服务器支持哪些请求方法(如GET、POST等)。Content-Encoding文档的编码(Encode)方法。只有在解码之后才可以得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档的下载时间。Java的GZIPOutp…...

智能风扇的全新升级:NRK3603语音芯片识别控制模块的应用
在当今智能化生活的潮流中,如何让家电更加人性化、便捷化,已经成为消费者和制造商关注的焦点。在这股大潮中,NRK3603语音识别模块以其出色的性能和广泛的应用,为智能电风扇带来了全新的升级。 1. 芯片特性 NRK3603是一款高性能、…...

如何通过pSLC技术实现性能与容量的双赢
目录 一、什么是 pSLC 二、各 NAND FLASH 的特点 三、pSLC 的优缺点 四、应用场景 一、什么是 pSLC pSLC(Pseudo-Single Level Cell)即伪 SLC,是一种将 MLC/TLC 改为 SLC 的一种技术,现 Nand Flash 基本支持此功能࿰…...

减速电机的基本结构及用料简介
资料来源:淘宝上某商家,它提供功率极小的电机。比如5W 1.整体结构剖面图 如下图,左侧是减速箱,和动力输出轴,右侧可以看到定子的铜丝绕组和中间的转子,它们贴合地非常紧密。气隙很窄。它的转子很像是铝制…...

1688跨境电商接口开放接入,跨境电商的尽头到底谁在赚钱?
1688(阿里巴巴)作为国内甚至全世界最大的线上批发集采平台,一直以来都是大部分跨境卖家选品和开发的主要平台之一,也保持着良好的上下游供应链关系。 不过,就在近日,1688正式推出跨境寻源通计划,…...

SpringBoot 增量部署发布
一、背景介绍 由于项目依赖的jar越来越多,Springboot默认的打包方式是将整个项目打包成一个jar包,每次发布时,打包后的jar越来越大,更新一个很小的功能,需要将整个jar上传运行。这样效率太低了,考虑实现每…...
java八股!1
集合 目录 集合java中存在哪些集合?底层实现逻辑?哪些集合是线程安全的?集合的对比:hash冲突如何解决hashmap为什么线程不安全,如何实现安全?hashmap中循环链表的产生hashmap底层实现原理和扩容机制map的遍…...

【学术会议征稿】2024年智能驾驶与智慧交通国际学术会议(IDST 2024)
2024年智能驾驶与智慧交通国际学术会议(IDST 2024) 2024 International Conference on Intelligent Driving and Smart Transportation 智能驾驶和智慧交通利用新兴技术,使城市出行更加方便、更具成本效益且更安全。在此背景下,由中南大学主办的2024年…...

2024最全网络安全工程师面试题(附答案)
🤟 基于入门网络安全/黑客打造的:👉黑客&网络安全入门&进阶学习资源包 2024年过去了一大半,先来灵魂三连问,年初定的目标完成多少了?薪资涨了吗?女朋友找到了吗? 一、网络…...
828华为云征文| 华为云 Flexus X 实例:引领云计算新时代的柔性算力先锋
828华为云征文| 华为云 Flexus X 实例:引领云计算新时代的柔性算力先锋 1. 推出背景 在数字经济快速发展的当下,数字化转型已成为企业发展的必然趋势。然而,中小企业在数字化转型过程中面临着诸多困境。据《2024 年中小企业数字化转型白皮书…...

何时何地,你需要提示工程、函数调用、RAG还是微调大模型?
介绍 在快速发展的生成式人工智能领域,某些流行术语已变得司空见惯:“提示工程”、“函数调用”、“RAG”和“微调”,你应该也经常遇到这些术语,但你是否能够理清这些概念之间的关系?这些其实都是一些大模型的应用策略…...

three.js线框模式
背景 设计师希望弄一个模型的这个效果: 但是,我使用three.js提供的EdgesGeometry死活只能做到下面这种: 后来才知道three.js只支持画三角面,四边形面并不支持,这是由更底层的webGL决定的。 但是在查找资料的过程中&…...

VScode 的简单使用
目录 1. VScode 的使用 1.1 常用插件 1.2 常用快捷键 1. VScode 的使用 1.1 常用插件 1.2 常用快捷键 也可以“ CTRLD ”;使用“CTRL滚轮”即可; ctrl /-,是用来展开/收起代码的; 比如:js 的多行注释是 shiftalt…...

五星级可视化页面(07):城市交通方向,城市畅通的保障。
城市交通方面的可视化大屏,一方面用户可以通过五星级可视化页面快速了解城市交通方向,实时掌握交通状况,选择最佳出行方案,提高出行效率,另一方面也有助于城市交通管理部门进行交通流量调度和管理。 本期发布一些经典…...

贪心+构造,1924A - Did We Get Everything Covered?
目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1924A - Did We Get Everything Covered? 二、解题报告 1、思路分析 我…...

麦汁煮沸工艺
麦汁煮沸是啤酒酿造中至关重要的工艺环节之一,直接影响啤酒的风味。今天,天泰邀您一起深入探讨这一关键的酿造技术。 煮沸麦汁 在煮沸麦汁时,时间和温度控制至关重要。通常,麦汁煮沸持续 40 到 50 分钟,具体时间取决于…...

企业级WEB应用服务器---TOMACT
一、WEB技术介绍 1.1 Http和B/S结构 操作系统一般都有子进程系统,使用多进程就可以充分利用硬件资源,提高效率。在前面的学习中我们了解到进程中可以有多个线程,且每一个线程都可以被CPU调度执行,这样就可以让程序并行执行。一台…...

前端:JavaScript中的this
前端:JavaScript中的this 1. this的指向2. 指定this的值3. 手写call方法4. 手写apply方法5. 手写bind方法 1. this的指向 在非严格模式下,总是指向一个对象;在严格模式下可以是任意值。 开启严格模式,如果是为整个脚本开启&#…...

Zynq7020 SDK 初学篇(5)- 中断
1.开发背景 基于上一个篇章 GPIO 使用,引入中断的使用。 2.开发需求 PS 和 PL 按键输入中断,并输出对应的日志打印 3.开发环境 Zynq7020 Vivado2017.4 4.实现步骤 4.1 设计配置 PL Key0 56 PS key0 12 PS key1 11 4.2 代码编写 GPIO 配置 #if…...

stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...

Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...

关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...