EmguCV学习笔记 VB.Net 6.5 凸包和凸缺陷

news2024/11/15 2:22:07

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。

EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。

教程VB.net版本请访问:EmguCV学习笔记 VB.Net 目录-CSDN博客

教程C#版本请访问:EmguCV学习笔记 C# 目录-CSDN博客

笔者的博客网址:https://blog.csdn.net/uruseibest

教程配套文件及相关说明以及如何获得pdf教程和代码,请移步:EmguCV学习笔记

学习VB.Net知识,请移步: vb.net 教程 目录_vb中如何用datagridview-CSDN博客

 学习C#知识,请移步:C# 教程 目录_c#教程目录-CSDN博客

 

6.5 凸包和凸缺陷

凸包是一个点集的凸多边形包围,即包含该点集的最小凸多边形。在计算机视觉和图像处理中,凸包常用于轮廓分析和形状检测等任务中。

凸缺陷是指凸多边形内部的空洞或空隙,即凸包与轮廓之间的空隙。在计算凸性缺陷时,我们需要先计算轮廓的凸包,然后计算凸包与轮廓之间的空隙。

6.5.1 凸包检测ConvexHull

CvInvoke.ConvexHull方法用于计算给定轮廓的凸包。凸包是能够包含所有轮廓点的最小凸多边形。该方法声明如下:

Public Shared Sub ConvexHull(points As Emgu.CV.IInputArray, hull As Emgu.CV.IOutputArray, Optional clockwise As Boolean = False, Optional returnPoints As Boolean = True)

参数说明:

  1. points:要计算凸包的轮廓。这是一个VectorOfPoint类型。对应使用FindContours方法获得的contours。
  2. hull:返回凸包顶点。
  3. clockwise:凸包顶点的顺序。True,表示获得的凸包顶点顺序为顺时针;否则为逆时针。
  4. returnPoints:是否返回凸包顶点的坐标。True,表示返回凸包顶点的坐标,此时hull为VectorOfPoint类型;否则为凸包顶点的索引,此时hull为VectorOfInt类型。

【代码位置:frmChapter6】Button20_Click

    '凸包检测

    Private Sub Button20_Click(sender As Object, e As EventArgs) Handles Button20.Click

        Dim msrc As New Mat("C:\learnEmgucv\hand.jpg", ImreadModes.AnyColor)

        ImageBox1.Image = msrc

        '二值化

        Dim gray As New Mat

        CvInvoke.CvtColor(msrc, gray, ColorConversion.Bgr2Gray)

        Dim mb As New Mat

        CvInvoke.Threshold(gray, mb, 240, 255, ThresholdType.BinaryInv)

        '进行一次开运算消除小的噪点

        Dim k As New Mat

        k = CvInvoke.GetStructuringElement(ElementShape.Rectangle, New Drawing.Size(3, 3), New Point(-1, -1))

        CvInvoke.MorphologyEx(mb, mb, MorphOp.Open, k, New Point(-1, -1), 1, BorderType.Default, New MCvScalar(0))

        ImageBox2.Image = mb

        '获得轮廓

        Dim contours As New VectorOfVectorOfPoint

        Dim hierarchy As New VectorOfRect

        CvInvoke.FindContours(mb, contours, hierarchy, RetrType.List, ChainApproxMethod.ChainApproxSimple)

        Dim hull As New VectorOfPoint

        '凸包检测,这里为简化,只有一个形状,其余参数使用默认值

        CvInvoke.ConvexHull(contours(0), hull)

        Dim mdst As New Mat

        mdst = msrc.Clone

        '绘制凸包顶点

        For i As Integer = 0 To hull.Size - 1

            CvInvoke.Circle(mdst, hull(i), 3, New MCvScalar(0, 0, 255), -1)

        Next

        ImageBox3.Image = mdst

End Sub

运行后如下图所示:

图6-21 获得凸包顶点

6.5.2 凸缺陷 ConvexityDefects

`CvInvoke.ConvexityDefects`是EmguCV中的一个方法,用于计算凸性缺陷,它需要三个参数:

Public Shared Sub ConvexityDefects(contour As Emgu.CV.IInputArray, convexhull As Emgu.CV.IInputArray, convexityDefects As Emgu.CV.IOutputArray)

  1. contour:要计算凸缺陷的轮廓。这是一个VectorOfPoint类型。对应使用FindContours方法获得的contours。
  2. convexhull:轮廓的凸包索引,类型为VectorOfInt。凸包可以使用CvInvoke.ConvexHull方法计算得到,其中ConvexHull方法的参数hull 应设置为VectorOfInt;参数returnPoints应设置为False。
  3. convexityDefects:输出的凸缺陷,这是一个包含四个数据的数组,它包含以下数据:1、凸包顶点的起点索引;2、凸包顶点的终点索引;3、轮廓上距离凸包最远的点;4、最远点到凸包的近似距离。在实际开发中,可以使用VectorOfRect来实现此数组。

注意:ConvexityDefects方法计算得到的凸缺陷可能包含一些无用的凸缺陷,这些凸缺陷的长度可能非常小,并且与实际凸缺陷无关。因此,我们需要在画凸缺陷时进行一些处理,只画出长度大于一定阈值的凸缺陷。

【代码位置:frmChapter6】Button21_Click

   '凸缺陷

    Private Sub Button21_Click(sender As Object, e As EventArgs) Handles Button21.Click

        Dim msrc As New Mat("C:\learnEmgucv\hand.jpg", ImreadModes.AnyColor)

        ImageBox1.Image = msrc

        Dim gray As New Mat

        CvInvoke.CvtColor(msrc, gray, ColorConversion.Bgr2Gray)

        Dim mb As New Mat

        CvInvoke.Threshold(gray, mb, 240, 255, ThresholdType.BinaryInv)

        Dim k As New Mat

        k = CvInvoke.GetStructuringElement(ElementShape.Rectangle, New Drawing.Size(3, 3), New Point(-1, -1))

        CvInvoke.MorphologyEx(mb, mb, MorphOp.Open, k, New Point(-1, -1), 1, BorderType.Default, New MCvScalar(0))

        Dim contours As New VectorOfVectorOfPoint

        Dim hierarchy As New VectorOfRect

        CvInvoke.FindContours(mb, contours, hierarchy, RetrType.List, ChainApproxMethod.ChainApproxSimple)

        Dim hullpoint As New VectorOfPoint

        Dim hullint As New VectorOfInt

        '1、为简化,这里只有一个形状

        '2、要使用ConvexityDefects,必须将ConvexHull参数returnPoints设置为false,也就是说需要的是凸包顶点的索引,

        '不使用以下方法

        CvInvoke.ConvexHull(contours(0), hullpoint, False, True)

        '使用以下方法:

        CvInvoke.ConvexHull(contours(0), hullint, False, False)

        Dim cd As New VectorOfRect

        '获得凸缺陷

        CvInvoke.ConvexityDefects(contours(0), hullint, cd)

        Dim mdst1 As New Mat

        mdst1 = msrc.Clone

        '获得凸缺陷点

        For i As Integer = 0 To cd.Size - 1

            Dim startIndex As Integer = cd(i).X     '凸包顶点的起点索引

            Dim endIndex As Integer = cd(i).Y       '凸包顶点的终点索引

            Dim farIndex As Integer = cd(i).Width   '轮廓上距离凸包最远的点的索引

            Dim dis As Integer = cd(i).Height       '最远点到凸包的近似距离

            'Console.WriteLine(startIndex & " " & endIndex & " " & farIndex & " " & dis)

            Dim startPoint As Point = contours(0)(startIndex)       '凸包顶点起点的坐标

            Dim endPoint As Point = contours(0)(endIndex)           '凸包顶点终点的坐标

            Dim farPoint As Point = contours(0)(farIndex)           '凸缺陷点的坐标

            '连接凸包顶点

            CvInvoke.Line(mdst1, startPoint, endPoint, New MCvScalar(128, 128, 0), 2)

            '绘制凸缺陷点

            CvInvoke.Circle(mdst1, farPoint, 5, New MCvScalar(0, 0, 255), -1)

        Next

        ImageBox2.Image = mdst1

        Dim mdst2 As New Mat

        mdst2 = msrc.Clone

        '获得凸缺陷点

        For i As Integer = 0 To cd.Size - 1

            Dim startIndex As Integer = cd(i).X

            Dim endIndex As Integer = cd(i).Y

            Dim farIndex As Integer = cd(i).Width

            Dim dis As Integer = cd(i).Height

            Dim startPoint As Point = contours(0)(startIndex)

            Dim endPoint As Point = contours(0)(endIndex)

            Dim farPoint As Point = contours(0)(farIndex)

            '连接凸包顶点

            CvInvoke.Line(mdst2, startPoint, endPoint, New MCvScalar(128, 128, 0), 2)

            '排除无用的凸缺陷

            If dis > 5000 Then

                '绘制凸缺陷点

                CvInvoke.Circle(mdst2, farPoint, 5, New MCvScalar(0, 0, 255), -1)

            End If

        Next

        ImageBox3.Image = mdst2

End Sub

运行后如下图所示,其中第三幅图是使用距离作为判断依据,排除了无用的凸缺陷点:

图6-22 获得凸缺陷点

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

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

相关文章

sgsegse

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话: 知不足而奋进,望远山而前行&am…

货车制造5G智能工厂工业物联数字孪生平台,推进制造业数字化转型

货车制造5G智能工厂工业物联数字孪生平台,推进制造业数字化转型。随着5G技术的飞速发展与工业物联网的深度融合,货车制造5G智能工厂工业物联数字孪生平台应运而生,它不仅重新定义了生产模式,更以强大的技术驱动力,推动…

开放世界目标检测:检测区分出未知物体

开放世界目标检测:检测区分出未知物体 01 Abstract 开放世界目标检测旨在识别未见过类别的目标,并在提供注释后逐步识别这些目标。与传统的只限于预定义类别的范式不同,这种设置承诺通过使用与类别无关的信息来持续且通用地估计目标性。然而…

Java码农35岁之后只能送外卖?

声明:此篇为 ai123.cn 原创文章,转载请标明出处链接:https://ai123.cn/2208.html Hey,Java界的小伙伴们,有没有感受到互联网行业这一场没有硝烟的“代际战争”?🤖💥 关于“35岁后只…

配电房挂轨机器人巡检系统的主要优点包括

背景 配电房是724h工作的封闭环境,人工巡检无法在时间上和空间上对配电室进行全量监控。有限的巡检时间,必然带来设备运转的黑盒时间,设备故障和隐患无法及时监控与消缺。因而不可避免存在漏检、误检的情况,不仅容易隐藏电力系统…

AI Agent产品经理血泪史:一年来我摸过的那些石头【Tools篇】

前几天刚好看到一篇关于GPT-6的报道,才想起来还有这麽回事情,于是赶紧把草稿捞出来改改交个任务。 至于为什麽贴这张图,以及为什麽血泪史从Tools开篇。 那是因为你看,即使到了GPT-6的时代,Tools仍然是AI Agent落地的…

ElementPlus下拉框输入框对齐问题

1.问题 2.解决方法 2.1label-width 说明:el-form中label-width设置为auto 2.2 label-wdith固定值 说明:如果在el-form-item里面设置了label-width"100px";采用宫格布局。 .demo-one{display: grid;grid-template-columns: repe…

C++:vector篇

前言: 本篇仅介绍vector中常用的函数接口,如果需要详细的请到官网查看。 vector是一种动态数组,能够自动调整大小。与数组类似,vector使用连续内存来存储元素,允许高效访问,但可以动态增加容量。为了应对容…

买了服务器后如何正确挂载数据盘|什么是系统盘,什么是数据盘

一、前言 我们买了服务器后,一般会再买一个数据盘,如果没有数据盘,万一服务器系统出现问题后数据丢失就完了,什么数据都没了,所以为了避免意外的发生,我们通常会再买一个数据盘 如上图,我就在…

差一点通关某公司面试靶场

没有web4和web8,web2的4没做出来。 web1 国光ssrf改版靶场 1 直接读取flag 3 使用file协议读取hosts IP为172.18.240.5 dict探针内网主机开启常见端口 172.18.240.1:80 172.18.240.5:3306 172.18.240.1:3306 172.18.240.5:80 172.18.240.5:8080 172.18.240.1:…

RocketMQ Dashboard

rocketmq-dashboard是一个可视化查看和管理RocketMQ消息队列的工具 官方地址:RocketMQ Dashboard | RocketMQ 1、点击下载源码 2、下载并解压,切换至源码目录rocketmq-dashboard-1.0.0 3、修改配置文件 4、编译 rocketmq-dashboard打成jar包 &#xf…

【2024最新】注册Github账号图文教程

GitHub 是一个全球最大的开源代码托管平台,它提供了基于 Git 的版本控制和协作功能,使开发者能够共享、管理和协作开发项目。用户可以创建、克隆、编辑代码,并通过分支、合并请求等工具进行协同工作。GitHub 还提供社区交流、项目管理和代码审…

qt圆环饼状图,非常小的窗口都能显示

非常小的窗口都能显示 QT core gui charts#include <QtCharts> using namespace QtCharts;//创建饼状图 void MainWindow::createpieSewies() {//饼状图QPieSeries * my_pieSeries new QPieSeries();//中间圆与大圆的比例my_pieSeries->setHoleSize(0.35);//…

Spring MVC、Spring Boot和Spring Cloud

一、Spring MVC 主要特点 传统的基于Servlet的Web框架: 需要手动配置Servlet、Filter等。 配置灵活: 可以使用XML或Java类来定义Bean和依赖关系。 依赖于Web容器: 需要部署到外部Web容器&#xff08;如Tomcat、Jetty&#xff09;中运行。 视图技术支持: 支持JSP、Thymelea…

DALI-2 NFC调光解码方案,电源模块,解码板

DALI-2 DT6 NFC 调光模块 一、产品概述 深圳锐科光电科技有限公司的DALI2 DT6&D4i&#xff0c;NFC调光模块&#xff0c;符合IEC62386-101 Ed2.0、IEC62386-102 Ed2.0和 IEC62386-207 Ed1 adapted to Ed2&#xff08;DT6&#xff09;标准协议。采用国外进口单片机芯片&#…

阮一峰《TypeScript 教程》学习笔记一类型系统、数组、元祖

阮一峰《TypeScript 教程》 本篇文章主要记录浏览阮一峰《TypeScript 教程》书籍的过程中本人不会的一些TypeScript的用法。当然&#xff0c;可以说&#xff0c;我都不会哈哈哈&#xff0c;不过有的用法比较奇葩的我就不记录了&#xff0c;只记录我觉得项目中会用到&#xff0c…

Python类型检查器库之typeshed使用详解

概要 在 Python 开发中,类型检查器(如 mypy)和 IDE(如 PyCharm)能够显著提高代码的可读性和可维护性。然而,Python 本身是一种动态类型语言,标准库和第三方库通常没有类型注解。这就需要一个包含这些库类型信息的资源库,以便类型检查器能够正常工作。Typeshed 正是这样…

【Python】学习Python的流程,有这一篇资料就够了,带你深入了解Python!!!

点击免费领取《CSDN大礼包》&#xff1a;Python入门到进阶资料 & 实战源码 & 兼职接单方法 安全链接免费领取 书籍推荐 《Python编程:从入门到实践》 作者&#xff1a;埃里克马瑟斯&#xff08;Eric Matthes&#xff09;特点&#xff1a;通过实际项目引导读者学习Pyt…

前端生成验证码

一.效果图 二、实现 2.1html <template><div class"outer-box"><div class"code-box"><div class"inout-code"><label class"label" for"inputCode">验证码&#xff1a;</label><…

内存管理篇-05物理页面的迁移类型migratetype

本节内容依旧是对上节课伙伴系统的补充&#xff0c;主要介绍了新版伙伴系统的页面迁移相关的内容 为什么要引入页面迁移类型&#xff1f;新版本伙伴系统针对老版本的伙伴系统的升级改进。主要优化memory compaction内存碎片整理的过程。 页面迁移实际上就是伙伴系统中free_area…