OpenCV结构分析与形状描述符(9)检测轮廓相对于其凸包的凹陷缺陷函数convexityDefects()的使用

news2024/11/25 16:00:54
  • 操作系统: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;
}

运行结果

在这里插入图片描述

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

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

相关文章

文件压缩项目(基于Huffman编码)

目录 文件压缩压缩本质huffman树huffman树的构建Huffman编码的压缩过程获取Huffman编码构建压缩信息 Huffman编码的解压缩过程解压压缩的数据 写压缩函数的注意事项文件指针移动到头 测试过程对文本文件进行压缩纯英文文本测试中文文本测试中英文文本测试 对图片进行压缩解压缩…

第 1 课 编程是一门技术 ——认识Dev-C++

1.什么是编程&#xff1f; 软件由程序和文档组成&#xff0c;每个程序都是由一条条计算机能够识别和执行的指令组成的&#xff0c;每一天指令指挥计算机完成指定的操作。编写程序又称编程&#xff0c;他是一门技术。通俗地讲&#xff0c;编程就是告诉计算机&#xff0c;你要帮我…

合成控制法SCM

研究D的处理效应&#xff0c;找一个相似的样本&#xff0c;他们的差异就是处理效应。但&#xff1a;难点就在如何找到相似的样本。那么就通过合成法来合成一个虚拟的重庆。 案例&#xff1a;美国加州香烟法案出台 依靠权重来合成一个新的y 假设我们不用SCM&#xff0c;直接靠着…

文心快码前端工程师观点分享:人机协同关系总结与展望

&#x1f381;&#x1f449;点击进入文心快码 Baidu Comate 官网&#xff0c;体验智能编码之旅&#xff0c;还有超多福利&#xff01;&#x1f381; 本系列视频来自百度工程效能部的前端研发经理杨经纬&#xff0c;她在由开源中国主办的“AI编程革新研发效能”OSC源创会杭州站1…

CloudberryDB 内核分享:Directory Table 底层逻辑与实现原理讲解

在之前的直播中&#xff0c;我们向大家介绍了&#x1f517;&#xff0c;为企业AI应用创新提供更高质量的非结构化数据语料输入和知识库支持&#xff0c;感兴趣的朋友可以点击链接阅读。 随着我们的开源数据仓库产品Cloudberry Database&#xff08;简称“CloudberryDB”&#…

杂七杂八-系统环境安装

杂七杂八-系统&环境安装 1. 系统安装2.环境安装 仅个人笔记使用&#xff0c;感谢点赞关注 1. 系统安装 Windows安装linux子系统WSL2&#xff1a;使用windows系统跑linux程序(大模型) 2.环境安装 目前仅专注于 NLP 大模型 机器学习和前后端的技术学习和分享 感谢大家的关注…

基于spring的博客系统(总)

通过前⾯课程的学习, 我们掌握了Spring框架和MyBatis的基本使⽤, 并完成了图书管理系统的常规功能 开发, 接下来我们系统的从0到1完成⼀个项⽬的开发&#xff1b; 1. 项⽬介绍 使⽤SSM框架实现⼀个简单的博客系统 共5个⻚⾯ 1. 用户登录 2. 博客发表⻚ 3. 博客编辑⻚ 4. 博客…

零工市场小程序是灵活就业的新趋势?

人力资源社会保障部曾发文《人力资源社会保障部 民政部 财政部 住房和城乡建设部 国家市场监管总局关于加强零工市场建设 完善求职招聘服务的意见》。 找零工在传统情况下会有比较多的困难&#xff0c;比如能能够掌握的信息较少、不知道工作单位是否靠谱等等的问题&#xff0c…

心觉:如何打破用脑学习的瓶颈?教你用心学习,实现真正蜕变!

Hi&#xff0c;我是心觉&#xff0c;与你一起玩转潜意识、脑波音乐和吸引力法则&#xff0c;轻松掌控自己的人生&#xff01; 挑战每日一省写作167/1000天 我们经常听到父母对孩子说要“用心学习&#xff0c;用心学习” 大概意思是告诉孩子学习的时候要专注&#xff0c;要认真…

【9月持续更新】国内ChatGPT-4中文镜像网站大全

一、国内大模型与ChatGPT的区别 &#x1f9e0; 国内大模型&#xff1a;专注于国内市场&#xff0c;支持本土企业及用户&#xff0c;适用于中文语境下的客服、教育、内容生成等应用场景。ChatGPT&#xff1a;全球适用性强&#xff0c;但在中文环境下的本地化程度不如国内大模型…

Arm GIC-v3中断原理及验证(通过kvm-unit-tests)

一、参考连接 gic-v3相关原理可参考https://zhuanlan.zhihu.com/p/520133301 本文主要通过开源测试工具kvm-unit-tests&#xff0c;针对GIC的中断进行一系列验证&#xff0c;这样可以直入中断底层&#xff0c;熟悉整个原理。 kvm-unit-tests官网为kvm-unit-tests / KVM-Unit…

『 Linux 』协议的定制

文章目录 协议的概念序列化和反序列化网络计算器套接字接口的封装服务端大致框架协议的定制Request的序列化与反序列化Response的序列化与反序列化报头的封装的解包网络服务服务端的封装已提取报文的移除客户端的封装客户端的调用服务端接收多个请求 JSON 自动序列化反序列化使…

QT打开摄像头采集

QT打开摄像头采集 今天好不容易把opencv的环境装好&#xff0c;然后想学习一下人脸识别的功能&#xff0c;但是在图书馆坐了4个多小时了&#xff0c;屁股疼就先写个摄像头采集的功能&#xff0c;明天继续学习吧&#xff0c;废话不多&#xff0c;嚼个奶片开始发车&#xff01;&…

3.安卓逆向-java语言控制流和数据类型

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 上一个内容&#xff1a;2.安卓逆向-初识java语言 上一个内容里写了编写java语言代码的环境搭建&#xff0c;也就是下载…

你的个人生成式AI创新课程

我曾经写过许多博客文章&#xff0c;讨论如何使用生成式AI&#xff08;GenAI&#xff09;工具&#xff0c;例如OpenAI ChatGPT、微软Copilot和Google Gemini来提升专业效率和个人发展。然而&#xff0c;我们必须从仅仅使用这些GenAI工具来提高生产力的思维模式&#xff0c;转变…

echarts 关系图 legend 图例不显示问题

关系图希望显示图例&#xff0c;如下效果&#xff1a; 按照常规echarts图表的配置&#xff0c;配置完legend&#xff0c;图例居然不显示。 legend: {show: true,icon: circle,left: left }经过一番查找和思考&#xff0c;原来是因为series配置中没有设置categories项&#xf…

通信工程学习:什么是SLF签约数据定位功能

SLF&#xff1a;签约数据定位功能 SLF&#xff08;Subscription Locator Function&#xff09;即签约数据定位功能&#xff0c;是IMS&#xff08;IP Multimedia Subsystem&#xff09;IP多媒体子系统体系结构中的一个关键组成部分。其主要功能是在网络运营商部署了多个独立可寻…

Android平台RTMP|RTSP播放器如何回调YUV或RGB数据?

技术选型 我们知道&#xff0c;Android平台一般RTMP|RTSP播放器通常不直接提供回调YUV或RGB数据的功能。如果播放端有视觉分析或类似的需求&#xff0c;需要播放端&#xff0c;能支持YUV或ARG的数据回调&#xff0c;一般来说&#xff0c;可参考的方法如下&#xff1a; 1. 使用…

尚硅谷的尚乐代驾项目

项目源码 乐尚代驾项目: 重做乐尚代驾项目 (gitee.com) 一 项目介绍 1 介绍 【**乐尚代驾**】代驾是一种新型的出行服务模式&#xff0c;主营业务&#xff1a;酒后代驾、商务代驾、长途代驾&#xff0c;其主要特点是通过线上平台为用户提供代驾服务&#xff0c;伴随中国家…

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、…