EmguCV学习笔记 VB.Net 6.4 霍夫变换

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

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.4 霍夫变换

霍夫变换(Hough Transform)是一种在图像中检测几何形状的常用方法,最初用于检测直线,后来也扩展到检测其他形状,如圆、椭圆等。霍夫变换的核心思想是将图像空间中的特征点映射到参数空间中,并通过在参数空间中寻找峰值来检测形状。

霍夫变换的优点是对于图像中的形状检测具有较好的鲁棒性,对于存在噪声和遮挡的情况仍能有效检测。然而,它的计算复杂度较高,对于大型图像或复杂形状的检测可能会消耗较多的计算资源。

在Emgu.CV中,霍夫变换相关的函数有CvInvoke.HoughLinesP用于检测直线线段,CvInvoke.HoughLines用于直线检测,CvInvoke.HoughCircles用于圆检测等。这些函数可以方便地在图像中进行霍夫变换来检测不同形状的目标。

6.4.1 HoughLines 

CvInvoke.HoughLines方法用于在图像中检测直线。该函数会返回检测到的直线的参数。该方法声明如下:

Public Shared Sub HoughLines(image As Emgu.CV.IInputArray, lines As Emgu.CV.IOutputArray, rho As Double, theta As Double, threshold As Integer, Optional srn As Double = 0, Optional stn As Double = 0)

参数说明:

  1. Image:输入源图像(一般为8位单通道二值图像)。
  2. lines:经过霍夫变换后检测线条的输出矢量。这里传入VectorOfPointF类型变量。返回的每一条线由两个元素的矢量(ρ, θ)表示, 其中ρ是离坐标原点的距离, θ是弧度线条旋转角度(0表示垂直线, n / 2度表示水平线)。
  3. rho:以像素为单位的距离精度, 可以认为是直线搜索时的步进尺寸的单位半径。
  4. theta:以弧度为单位的角度精度, 可以认为是直线搜索时的步进尺寸的角度单位,常设为 Math.PI / 180。
  5. threshold:直线检测的阈值,只有当检测到的点数大于该阈值时才认为是直线。
  6. srn:控制距离分辨率。将距离分辨率除以srn+1,从而减小距离分辨率。其默认值为0。该参数的值越大,累加器空间的距离分辨率就越低,检测到的直线数量也会相应地减少。
  7. stn:控制角度分辨率。将角度分辨率除以stn+1,从而减小角度分辨率。其默认值为0。该参数的值越大,累加器空间的角度分辨率就越低,检测到的直线数量也会相应地减少。

【代码位置:frmChapter6】Button16_Click

   'HoughLines

    Private Sub Button16_Click(sender As Object, e As EventArgs) Handles Button16.Click

        Dim m1 As New Mat("C:\learnEmgucv\line.jpg", CvEnum.ImreadModes.AnyColor)

        '边缘检测

        Dim mid1 As New Mat

        CvInvoke.Canny(m1, mid1, 80, 255, 3)

        '二值化

        Dim mid2 As New Mat

        CvInvoke.Threshold(mid1, mid2, 125, 255, ThresholdType.Binary)

        ImageBox1.Image = mid2

        'HoughLines检测直线

        Dim outlines As New  VectorOfPointF

        CvInvoke.HoughLines(mid2, outlines, 1, Math.PI / 180, 250, 0, 0)

        Dim m2 As New Mat

        m2 = mid1.Clone()

        m2.SetTo(New MCvScalar(0))

        '计算每条直线的起始坐标,并绘制出来

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

            Dim line As PointF = outlines(i)

            Dim rho As Double = line.X

            Dim theta As Double = line.Y

            Dim a As Double = Math.Cos(theta)

            Dim b As Double = Math.Sin(theta)

            Dim x0 As Double = rho * a

            Dim y0 As Double = rho * b

            Dim pt1 As New Point

            pt1.X = Math.Round(x0 + m2.Cols * (-b))

            pt1.Y = Math.Round(y0 + m2.Rows * a

            Dim pt2 As New Point

            pt2.X = Math.Round(x0 - m2.Cols * (-b))

            pt2.Y = Math.Round(y0 - m2.Rows * a)

            '绘制直线

            CvInvoke.Line(m2, pt1, pt2, New MCvScalar(255), 2)

        Next

        ImageBox2.Image = m2

        '减少检测到的点数

        Dim outlines3 As New VectorOfPointF

        CvInvoke.HoughLines(mid2, outlines3, 1, Math.PI / 180, 120, 0, 0)

        Dim m3 As New Mat

        m3 = mid1.Clone()

        m3.SetTo(New MCvScalar(0))

        Dim length3 As Double = Math.Max(m3.Rows, m3.Cols)

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

            Dim line As PointF = outlines3(i)

            Dim rho As Double = line.X

            Dim theta As Double = line.Y

            Dim a As Double = Math.Cos(theta)

            Dim b As Double = Math.Sin(theta)

            Dim x0 As Double = rho * a

            Dim y0 As Double = rho * b

            Dim pt1 As New Point

            pt1.X = Math.Round(x0 + m2.Cols * (-b))

            pt1.Y = Math.Round(y0 + m2.Rows * a)

            Dim pt2 As New Point

            pt2.X = Math.Round(x0 - m2.Cols * (-b))

            pt2.Y = Math.Round(y0 - m2.Rows * a)

            CvInvoke.Line(m3, pt1, pt2, New MCvScalar(255), 2)

        Next

        ImageBox3.Image = m3

End Sub

运行后如下图所示:

图6-17 直线检测结果

6.4.2 HoughLinesP        

CvInvoke.HoughLinesP方法用于在图像中检测线段。该方法的两个声明如下:

Public Shared Sub HoughLinesP(image As Emgu.CV.IInputArray, lines As Emgu.CV.IOutputArray, rho As Double, theta As Double, threshold As Integer, Optional minLineLength As Double = 0, Optional maxGap As Double = 0)

Public Shared Function HoughLinesP(image As Emgu.CV.IInputArray, rho As Double, theta As Double, threshold As Integer, Optional minLineLength As Double = 0, Optional maxGap As Double = 0) As Emgu.CV.Structure.LineSegment2D()

参数解释:

  1. image:输入图像(Image(Of Gray, Byte)类型)。
  2. lines:经过霍夫变换后检测线条的输出矢量。VectorOfRect类型,每个成员是一个Rectangle类型,属性X 、Y、Width、Height分别表示第一个点的X、第一个点的Y,第二个点的X、第二个点的Y。
  3. rho:以像素为单位的距离精度。
  4. theta:以弧度为单位的角度精度。
  5. threshold:直线检测的阈值,只有当检测到的点数大于该阈值时才认为是直线。
  6. minLineLength:线段的最小长度,小于该长度的线段将被忽略。
  7. maxLineGap:线段之间的最大间隔,超过该间隔的线段将被认为是不同的线段。

返回值:

检测到的线段数组(LineSegment2D()类型)。

【代码位置:frmChapter6】Button17_Click

    'HoughLinesP

    Private Sub Button17_Click(sender As Object, e As EventArgs) Handles Button17.Click

        Dim m1 As New Mat("C:\learnEmgucv\line.jpg", CvEnum.ImreadModes.AnyColor)

        '边缘检测

        Dim mid1 As New Mat

        CvInvoke.Canny(m1, mid1, 80, 255, 3)

        '二值化

        Dim mid2 As New Mat

        CvInvoke.Threshold(mid1, mid2, 125, 255, ThresholdType.Binary)

        ImageBox1.Image = mid2

        Dim outlines() As LineSegment2D

        outlines = CvInvoke.HoughLinesP(mid2, 1, Math.PI / 180, 100, 0, 0)

        Dim m2 As New Mat

        m2 = mid1.Clone()

        m2.SetTo(New MCvScalar(0))

        '绘制检测出的线段

        For i As Integer = 0 To outlines.Length - 1

            CvInvoke.Line(m2, outlines(i).P1, outlines(i).P2, New MCvScalar(255), 2)

        Next

        ImageBox2.Image = m2

        Dim outlines2 As New VectorOfRect()

        CvInvoke.HoughLinesP(mid2, outlines2, 1, Math.PI / 180, 100 5 30)

        Dim m3 As New Mat

        m3 = mid1.Clone()

        m3.SetTo(New MCvScalar(0))

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

            CvInvoke.Line(m3, New Point(outlines2(i).X, outlines2(i).Y), New Point(outlines2(i).Width, outlines2(i).Height), New MCvScalar(255), 2)

        Next

        ImageBox3.Image = m3

End Sub

运行后如下图所示:

图6-18 线段检测结果

6.4.3 HoughCircles

CvInvoke.HoughCircles函数用于在图像中检测圆形,该方法声明如下:

Public Shared Function HoughCircles(image As Emgu.CV.IInputArray, method As Emgu.CV.CvEnum.HoughModes, dp As Double, minDist As Double, Optional param1 As Double = 100, Optional param2 As Double = 100, Optional minRadius As Integer = 0, Optional maxRadius As Integer = 0) As Emgu.CV.Structure.CircleF()

参数说明:

  1. image:8位单通道灰度源图像(或者传入的源图像是Image(Of Gray, Byte)类型)。
  2. method:霍夫变换的方法,可以选择HoughType.Gradient或HoughType.GradientAlt。
  3. dp:累加器图像的分辨率与输入图像的分辨率之比。例如,dp = 1,则累加器具有与输入图像相同的分辨率。如果dp = 2,则累加器的宽度和高度都是一半。
  4. minDist:检测到的圆心之间的最小距离,太小会多检,太大会漏检。
  5. param1:Canny边缘检测的高阈值。
  6. param2:圆心累加器阈值,只有当累加器图像中的值大于该阈值时才认为是圆心。相应的该阈值越小,可得到越多的圆。
  7. minRadius:达到检测要求的最小圆半径。
  8. maxRadius:达到检测要求的最大圆半径。

返回值:

检测到的圆形数组(CircleF()类型)。

【代码位置:frmChapter6】Button18_Click

    'HoughCircles

    Private Sub Button18_Click(sender As Object, e As EventArgs) Handles Button18.Click

        Dim m1 As New Mat("C:\learnEmgucv\aoyun.jpg", CvEnum.ImreadModes.Grayscale)

        ImageBox1.Image = m1

        Dim mid1 As New Mat

        CvInvoke.GaussianBlur(m1, mid1, New Drawing.Size(3, 3), 3)

        ImageBox2.Image = mid1

        Dim outcircle() As CircleF

        outcircle = CvInvoke.HoughCircles(mid1, HoughModes.Gradient, 2, 50, 140, 220, 5)

        Dim m2 As New Mat

        m2 = mid1.Clone()

        m2.SetTo(New MCvScalar(255))

        For i As Integer = 0 To outcircle.Length - 1

            CvInvoke.Circle(m2, New Point(Integer.Parse(outcircle(i).Center.X), Integer.Parse(outcircle(i).Center.Y)), outcircle(i).Radius, New MCvScalar(0), 2)

        Next

        ImageBox3.Image = m2

End Sub

运行后如下图所示:

图6-19 圆形检测结果

另外一个例子,代码同上,只是载入的图片不同:

【代码位置:frmChapter6】Button19_Click

……

     Dim m1 As New Mat("C:\learnEmgucv\Matchimg.jpg", CvEnum.ImreadModes.Grayscale)

……

运行后如下图所示:

图6-20 圆形检测结果

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

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

相关文章

ArcGIS Pro基础:如何将数据和引用地图样式一起打包分享

如上所示,有2个矢量图斑,一个是耕地地块,另一个是范围图斑,如果我们需要把此工程的所有数据以及引用地图一起分享给别人,就可以使用【打包工程】这个工具。 如上所示,在【地理处理】下输入【打包工程】&am…

【C语言】常见文件操作

文件的常见操作 #include<stdio.h>// 由于devc代码编码为ANCI&#xff0c;故读取的文件中若有中文&#xff0c;请设置文件编码为ANCI&#xff0c;否则会乱码 // 读文件 void test1() {char ch;FILE *fp; // 创建文件指针fp fopen("./file.txt", "r"…

数据结构系列-归并排序

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 归并排序 递归版本 首先&#xff0c;我们来看一下归并的示意图&#xff1a; 这是归并排序当中分解的过程。 然后便是两个两个进行排序&#xff0c;组合的过程。 归并完美的诠释…

系统编程-管道

管道 目录 管道 1、管道的特点 2、无名管道的使用步骤 &#xff08;1&#xff09;在进程中使用 pipe 函数来获取管道的文件描述符 &#xff08;2&#xff09;使用 fork 函数来创建子进程 &#xff08;3&#xff09;通过获取到的文件描述符来进行数据的传输 &#xff08…

[论文阅读] mobile aloha实验部分

DP:[1] CHI C, FENG S, DU Y, et al. Diffusion Policy: Visuomotor Policy Learning via Action Diffusion[J]. 2023. Diffusion Policy: Visuomotor Policy Learning via Action Diffusion精读笔记&#xff08;一&#xff09;-CSDN博客 哥伦比亚大学突破性的方法- Diffusio…

【SpringBoot】11 多数据源(MyBatis:dynamic-datasource)

介绍 多数据源&#xff1a;指的是一个单一应用程序中涉及了两个及以上的数据库&#xff0c;这种配置允许应用程序根据业务需求灵活地管理和操作不同的数据库。 需求 一个应用服务中&#xff0c;连接多个数据库&#xff0c;有本地的也有远程的&#xff0c;有MysQL、Oracle、P…

PDPS软件 那智机器人 (丰田版)离线程序导出处理

在PDPS仿真软件中导出的那智机器人离线程序&#xff0c;一般是无法直接给TFD控制装置-那智机器人&#xff08;丰田式样版&#xff09;导入及识别使用。因此要对导出的程序进行转换编译处理&#xff0c;才能给TFD那智机器人&#xff08;丰田式样版&#xff09;导入离线程序。以下…

react antd TreeSelect实现自定义标签

<ProFormTreeSelectlabel"接收对象"name"receiverObjects"colProps{{ span: 16 }}labelCol{{span: 6,}}wrapperCol{{span: 18,}}rules{[{ required: true }]}fieldProps{{showSearch: true,multiple: true,// autoClearSearchValue: true,filterTreeNod…

NASA:北极辐射-冰桥海冰实验(ARISE)2014年原地云数据产品

ARISE_Cloud_AircraftInSitu_C130_Data 简介 ARISE_Cloud_AircraftInSitu_C130_Data_1是北极辐射-冰桥海冰实验&#xff08;ARISE&#xff09;2014年原地云数据产品。该产品是位于华盛顿的美国宇航局科学任务局地球科学部辐射科学、冰冻层科学和机载科学计划共同努力的成果。…

基于单片机的一氧化碳报警系统的设计与实现

摘 要&#xff1a; 一氧化碳对人体有害&#xff0c;尤其超标时会影响人们的健康 。 因此文章设计了一款基于单片机的一氧化氮报警器设计。 论文通过传感器检测一氧化碳浓度&#xff0c;经过 AD 转换&#xff0c;再把检测信号传递给单片机&#xff0c;经过分析处理&#xff0c…

论文辅助笔记:Large Language Models are Zero-Shot Next LocationPredictors

论文理论部分&#xff1a;论文笔记&#xff1a;lunLarge Language Models are Zero-Shot Next LocationPredictors-CSDN博客 2 Data 2.1 Dataset类 2.2 下载文件 2.3 get_dataset 2.4 get_trajectories trajectory_split暂时略去 # save the test dictionary and the true l…

redis核心数据结构源码分析

dictEntry和redisObject 在 Redis 的实现中&#xff0c;当一个键值对被创建并存储时&#xff0c;键通常是一个字符串&#xff0c;而值则是一个 redisObject。因此&#xff0c;在 dictEntry 结构中&#xff0c;key 成员指向的是一个字符串&#xff0c;而 v.val 成员则指向一个 …

45.5【C语言】typedef

目录&#xff1a; *全称 *格式 一般指针 数组指针 函数指针 *细节 *全称 type define 类型&#xff08;重新&#xff09;定义&#xff08;或命名&#xff09;&#xff0c;可简化输入 *格式 1.非指针类型: typedef 类型 简化名称 typedef signed long long k; signed long …

搭建自己的金融数据源和量化分析平台(七):定时更新上市公司所属行业门类及大类

0x00 前言 由于此前从深交所下载的股票信息中只有行业门类信息&#xff0c;没有行业大类信息&#xff0c;导致后续解析三大报表和量化选股的时候无法进行&#xff1a; 可以看到深交所的股票是没有大类信息的。 再看看上交所的保险股&#xff1a; 因此需要将深交所股票的所属…

WIFI驱动开发

Linux 4.9 内核驱动移植 Linux 4.9 BSP 内核驱动 下载驱动后获得驱动的 tar.gz 压缩包 解压后找到如下驱动与文件夹 进入内核&#xff0c;找到 linux-4.9/drivers/net/wireless 文件夹中&#xff0c;新建文件夹aic8800 并且把上面的驱动与文件夹放入刚刚创建好的 aic8800 中。…

【MySQL】 黑马 MySQL进阶 笔记

文章目录 存储引擎MySQL的体系结构存储引擎概念存储引擎特点InnoDBMyISAMMemory 存储引擎选择 索引概述结构B Tree(多路平衡查找树)B TreeHash为什么InnoDB存储引擎选择使用Btree索引结构? 分类思考题 语法SQL性能分析&#xff08;索引相关&#xff09;SQL执行频率慢查询日志p…

SSRF和CSRF实战复现

文章目录 SSRFWeb-Hacking-Lab-master1、Centos未授权访问2、Ubuntu未授权访问3、Ubuntu传入公钥访问4、ssrf_redis_lab_pickle_redis_lab CSRF:windphp SSRF SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。 f…

Unity 波函数坍缩算法随机地图生成

Unity 波函数坍缩算法随机地图生成 波函数波函数基本概念位置空间波函数动量空间波函数两种波函数之间的关系波函数的本征值和本征态波函数坍缩 熵是什么熵作为状态函数时间之箭 实现原理举个例子&#xff1a;2D迷宫地图生成 Unity 如何实现前期准备单元格代码瓦片地图代码波函…

通过建模走出人工智能寒冬

很多人对 GenAI 是否会产生商业影响持怀疑态度&#xff0c;但我认为他们不仅错了&#xff0c;而且犯了 2001 年人们在互联网上犯下的错误。他们认为硅谷的炒作是无稽之谈&#xff0c;因此其背后的想法也是无稽之谈。 这是很危险的&#xff0c;我认为&#xff0c;这比大多数零售…

nacos 使用 docker 单机部署连接 MySQL 数据库并开启鉴权

文章目录 本地部署的配置启用鉴权(未验证) docker部署的配置修改docker 镜像源启用鉴权&#xff0c;必须添加如下环境变量如何生成鉴权的密钥 完整环境变量docker启动命令 本地部署的配置 文件结构 application.properties #配置文件 mysql-schema.sql …