EmguCV学习笔记 VB.Net 6.S 特别示例

news2024/11/14 13:56:28

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

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.S 特别示例

6.S.1图像中的圆半径

本示例来自一名网友咨询如何获得图像中圆形的半径,其中有两个十字作为标记,十字之间距离为100mm。如下图:

图6-28 根据给出的定位标记求圆半径

【代码位置:frmChapter6_S1】Button1_Click、PointFToPoint

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

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

        Dim mgray As New Mat()

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

        Dim kernel As New Mat

        kernel = CvInvoke.GetStructuringElement(ElementShape.Cross, New Drawing.Size(3, 3), New Point(-1, -1))

        Dim merode As New Mat        '

        '这里使用了2次迭代

        CvInvoke.Dilate(mgray, merode, kernel, New Point(-1, -1), 1, BorderType.Constant, Nothing)

        CvInvoke.Threshold(merode, merode, 200, 255, ThresholdType.BinaryInv)

        ImageBox1.Image = merode

        '获得所有轮廓

        Dim contours As New VectorOfVectorOfPoint

        Dim hierarchy As New VectorOfRect

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

        Dim m2 As New Mat(merode.Size, DepthType.Cv8U, 1)

        m2.SetTo(New MCvScalar(0))

        '圆轮廓

        Dim contourCircle As VectorOfPoint

        '圆轮廓的周长

        Dim perimeter As Double

        '绘制轮廓

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

            Dim carea As VectorOfPoint = contours(i)

            '获得轮廓面积

            Dim area As Double = CvInvoke.ContourArea(carea, False)

            '符合条件时,绘制轮廓,排除圆形,只保留十字线

            '本图中圆形面积为2449,直线面积为8,需要根据实际情况调整

            If area < 200 Then

                CvInvoke.DrawContours(m2, contours, i, New MCvScalar(255), 0.4)

            Else

                '得到圆形,图像中只有三个轮廓:2个交叉十字线段、1个圆形

                '这里简化操作,否则在多个轮廓情况下,应获取最大面积的轮廓判断为圆形

                contourCircle = contours(i)

                '获取轮廓周长

                perimeter = CvInvoke.ArcLength(contourCircle, True)

            End If

        Next

        ImageBox1.Image = m2

        '使用HoughLinesP方法检测图像中的直线,并将其绘制到图像

        '因为本图中十字线上的线段较短,所以这里阈值设置很小

        Dim lines As LineSegment2D() = CvInvoke.HoughLinesP(m2, 1, Math.PI / 180, 5, 5, 80)

        Dim m3 As New Mat(merode.Size, DepthType.Cv8U, 3)

        m3.SetTo(New MCvScalar(0, 0, 0))

        For Each line As LineSegment2D In lines

            CvInvoke.Line(m3, line.P1, line.P2, New MCvScalar(0, 255, 0), 2)

        Next

        ImageBox2.Image = m3

        '对直线进行分类,将其分为垂直和水平两类:

        Dim verticalLines As New List(Of LineSegment2D)

        Dim horizontalLines As New List(Of LineSegment2D)

        '计算每条直线的倾斜角度来进行分类,

        '将倾斜角度在60 - 120度之间的直线划分为垂直类,

        '将倾斜角度在30 - 150度之间的直线划分为水平类。

        For Each line As LineSegment2D In lines

            Dim angle As Double = Math.Atan2(line.P2.Y - line.P1.Y, line.P2.X - line.P1.X) * 180 / Math.PI

            If angle < 0 Then angle += 180

            If angle > 60 AndAlso angle < 120 Then

                verticalLines.Add(line)

            ElseIf angle > 150 OrElse angle < 30 Then

                horizontalLines.Add(line)

            End If

        Next

        '对垂直和水平直线进行匹配,并计算十字中心点的位置:

        Dim intersections As New List(Of PointF)

        '得到两个相交点

        For Each verticalLine As LineSegment2D In verticalLines

            For Each horizontalLine As LineSegment2D In horizontalLines

                '基于图像中两条直线真实相交,

                '如果垂直线的中点X坐标在水平线两端点X坐标之间

                '那么,这条垂直线段和这条水平线段相交

                Dim centerX As Single = (verticalLine.P1.X + verticalLine.P2.X) / 2

                If horizontalLine.P1.X < horizontalLine.P2.X Then

                    If centerX > horizontalLine.P1.X And centerX < horizontalLine.P2.X Then

                        Dim intersectionPoint As New PointF(

                            (horizontalLine.P1.X + horizontalLine.P2.X + verticalLine.P1.X + verticalLine.P2.X) / 4,

                            (horizontalLine.P1.Y + horizontalLine.P2.Y + verticalLine.P1.Y + verticalLine.P2.Y) / 4

                        )

                        intersections.Add(intersectionPoint)

                    End If

                Else

                    If centerX > horizontalLine.P2.X And centerX < horizontalLine.P1.X Then

                        Dim intersectionPoint As New PointF(

                            (horizontalLine.P1.X + horizontalLine.P2.X + verticalLine.P1.X + verticalLine.P2.X) / 4,

                            (horizontalLine.P1.Y + horizontalLine.P2.Y + verticalLine.P1.Y + verticalLine.P2.Y) / 4

                        )

                        intersections.Add(intersectionPoint)

                    End If

                End If

            Next

        Next

        If intersections.Count <> 2 Then

            MessageBox.Show("未能获得两个十字线的交叉点")

            Exit Sub

        End If

        CvInvoke.Line(msrc, PointFToPoint(intersections(0)), PointFToPoint(intersections(1)), New MCvScalar(0, 255, 0), 2)

        CvInvoke.Imshow("m3", msrc)

        '计算两个交点的距离

        Dim distance As Double = Math.Sqrt(

            (intersections(0).X - intersections(1).X) ^ 2 +

            (intersections(0).Y - intersections(1).Y) ^ 2

        )

        '实际中两交点距离为100毫米,计算相应比例

        Dim proportion As Double = 100 / distance

        '以下是基于最小外接圆来计算实际圆半径

        Dim cf As CircleF

        cf = CvInvoke.MinEnclosingCircle(contourCircle)

        '获得外接圆形

        CvInvoke.Circle(msrc, New Point(CInt(cf.Center.X), CInt(cf.Center.Y)), cf.Radius, New MCvScalar(0, 0, 255), 2)

        CvInvoke.Imshow("m4", msrc)

        '实际圆半径

        Dim realradius1 As Double

        realradius1 = proportion * cf.Radius

        '以下是基于轮廓周长来计算实际圆半径

        '实际圆周长

        Dim realperimeter As Double = perimeter * proportion

        '图像中的圆半径

        Dim radius As Double

        radius = (perimeter / Math.PI) / 2

        '实际圆半径

        Dim realradius2 As Double

        realradius2 = proportion * radius

        MessageBox.Show("最小外接圆来计算实际圆半径:" & realradius1 & ControlChars.CrLf &

                        "基于轮廓周长来计算实际圆半径:" & realradius2)

    End Sub

输出结果如下图所示:

图6-29 求出的圆半径

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

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

相关文章

深度学习基础(Datawhale X 李宏毅苹果书AI夏令营)

深度学习基础(Datawhale X 李宏毅苹果书AI夏令营) 3.1局部极小值和鞍点 3.1.1. 优化失败问题 在神经网络中&#xff0c;当优化到梯度为0的地方&#xff0c;梯度下降就无法继续更新参数了&#xff0c;训练也就停下来了&#xff0c;如图&#xff1a; 梯度为0的情况包含很多种情…

Anaconda3简介与安装步骤

目录 Anaconda3简介与功能 1.Anaconda3简介 2.主要功能和特点 3.使用场景 4.总结 Anaconda3安装 1.Anaconda3下载 1.1我的百度网盘 1.2官网下载 1.2.1访问官网 1.2.2输入邮箱 1.2.3登录你的邮箱下载&#xff08;你的噶&#xff09; 2.安装 2.1双击安装 2.2选择安…

分块矩阵的转置

证明 则 证明&#xff1a;令&#xff0c;有&#xff0c;对它做一个分块使得和后面的分块矩阵中的是同型矩阵&#xff0c;要证明&#xff08;任意的&#xff09;&#xff0c;需要证明1&#xff09;是一个的矩阵 2&#xff09;任意的 首先证明1&#xff09;我们先定义两个函…

HarmonyOS ArkUI工程框架解析

通过 HarmonyOS Developer 官网我们可以了解 ArkUI 是一套声明式开放框架&#xff0c;开发者可以基于 ArkTS 语法设计一套极简的 DSL 以及丰富的 UI 组件完成跨设备的界面开发。 那么 ArkUI 是如何实现这一套声明式开放框架的呢&#xff1f;本文将通过分析开源的 HarmonyOS 渲染…

记录devtmpfs:error mounting -2问题的解决

ext4文件系统制作有问题. 重新制作文件系统烧录 /dev文件夹丢失

软考攻略/超详细/系统集成项目管理工程师/基础知识分享04

第二章 信息技术发展 2.1信息技术及其发展 2.1.1 计算机软硬件&#xff08;了解&#xff09; 在许多情况下&#xff0c;计算机的某些功能既可以由硬件实现&#xff0c;也可以由软件来实现。 1、计算机硬件 计算机硬件主要分为&#xff1a;控制器、运算器、存储器、输入设备和…

开发中如何在运行/调试时将项目热部署到Tomcat

这里有一篇不错的博客&#xff0c;可以参考 http://t.csdnimg.cn/oWcgm 正常情况下&#xff0c;我们将web项目打包成war包后&#xff0c;需要放到tomcat的webapps路径下&#xff0c;然后启动tomcat&#xff0c;才能正常访问。但是这在开发阶段是极为不便的。因此可以使用两种方…

基于机器学习的工业制造缺陷分析预测系统

B站视频及代码下载&#xff1a;基于机器学习的工业制造缺陷分析预测系统-视频-代码 1. 项目简介 制造缺陷是工业生产过程中面临的重大挑战之一&#xff0c;对产品质量和生产效率产生直接影响。准确预测和分析制造缺陷的发生&#xff0c;可以帮助企业提高生产质量、降低成本&…

DNS 服务器的搭建(正向区域配置)

一、Windows DNS 正向区域配置 1.实验目标 2.拓扑结构 3.实验需求 4.配置要点 5.配置步骤 1.配置各主机 IP 地址及网关 2.DNS 服务器服务部署 3.验证实验 一、Windows DNS 正向区域配置 1.实验目标 掌握 DNS 的功能和基本操作 熟悉公网 DNS 架构 掌握 DNS …

豆瓣同城活动采集

可采集豆瓣同城活动&#xff0c;来辅助分析一个城市的文商旅体活跃繁荣程度。 示例数据&#xff1a; 活动网址&#xff1a;已屏蔽不显示 封图网址&#xff1a;已屏蔽不显示 标题&#xff1a;【百年老号-本地观众力捧】谦祥益相声茶馆-陆家嘴店 开始日期&#xff1a;2024-0…

tomcat在idea中 乱码(service ,catalina log)

我试了很多方法&#xff0c;把idea中的所有配置都改成了utf-8&#xff0c;&#xff08;包括修改vm配置&#xff0c;fileEndcoding&#xff0c;外部文件endcodeing ...等等&#xff09;都没有改好&#xff0c; 最后在修改了tomcat的配置文件&#xff0c;就好了 在tomcat的安装…

【C++ 第十六章】哈希

1. unordered系列关联式容器 在C98中&#xff0c;STL提供了底层为红黑树结构的一系列关联式容器&#xff0c;在查询时效率可达到 &#xff0c;即最差情况下需要比较红黑树的高度次&#xff0c;当树中的节点非常多时&#xff0c;查询效率也不理想。最好 的查询是&#xff0c;进行…

Modern C++——函数参数类型的分类和使用

大纲 基本定义值类型左值引用非常量左值引用常量左值引用 右值引用总结 在C中&#xff0c;函数参数主要有两种方式&#xff1a;值类型和引用类型。其中引用类型又分为&#xff1a;左值引用和C11引入的右值引用。下面我们分别对其进行介绍。 基本定义 要弄清楚这些概念&#x…

三级_网络技术_51_应用题

一、 请根据下图所示网络结构回答下列问题。 1.填写路由器RG的路由表项。 目的网络/掩码长度输出端口__________S0&#xff08;直接连接&#xff09;__________S1&#xff08;直接连接&#xff09;__________S0__________S1__________S0__________S1 2.如果需要监听路由器RE…

mysql理论学习上

1&#xff1a;常⻅的SQL语句 1.1sql介绍 SQL 是⽤于访问和处理数据库的标准的计算机语⾔。 SQL&#xff0c;指结构化查询语⾔&#xff0c;全称是 Structured Query Language。SQL 让您可以访问和处理数据库。 SQL 是⼀种 ANSI&#xff08;American National Standards Inst…

SSRF漏洞(二)

本文仅作为学习参考使用&#xff0c;本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 前言&#xff1a; 本文主要讲解依靠phpstudy搭建pikachu靶场。 phpstudy下载使用以及搭建本地SQL labs靶场 SSRF漏洞&#xff08;一&#xff09; 一&#xff0c;靶场搭建。 靶场…

用Python实现时间序列模型实战——Day1:时间序列的基本概念

一、学习内容 1. 时间序列数据的定义与特点 定义&#xff1a; 时间序列数据是一组按时间顺序排列的观测值。时间序列的每个观测值都与特定时间点相关联。例如&#xff0c;气温每天的记录、股票每日的收盘价等。 特点&#xff1a; 时间依赖性&#xff1a;时间序列数据的一个…

ssm基于微信小程序的食堂窗口自助点餐系统源码调试讲解

1. 环境搭建 JDK 1.8&#xff1a;确保您的系统已安装JDK 1.8&#xff0c;并配置好环境变量。JDK 1.8 是目前很多Java项目仍在使用的稳定版本&#xff0c;适用于SSM框架。Tomcat 7&#xff1a;安装并配置Tomcat 7作为您的Web服务器。Tomcat 7 支持Servlet 3.0和JSP 2.2&#xf…

黑马JavaWeb开发笔记07——Ajax、Axios请求、前后端分离开发介绍、Yapi详细配置步骤

文章目录 前言一、Ajax1. 概述2. 作用3. 同步异步4. 原生Ajax请求&#xff08;了解即可&#xff09;5. Axios&#xff08;重点&#xff09;5.1 基本使用5.2 Axios别名&#xff08;简化书写&#xff09; 二、前后端分离开发1. 介绍1.1 前后台混合开发1.2 前后台分离开发方式&…

使用 OpenCV 组合和缩放多张图像

在图像处理领域&#xff0c;我们经常需要将多张小图像组合成一张大图。例如&#xff0c;将多张图像按一定布局排列在一起&#xff0c;或者创建一个缩略图画廊。在这篇博客中&#xff0c;我将向你展示如何使用 Python 的 OpenCV 库来完成这一任务。 代码 下面是一段完整的 Pyt…