EmguCV学习笔记 VB.Net 7.1 角点检测

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

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博客

 

7.1 角点检测

角点是特征点的一种,是指在图像中具有尖锐变化的像素点,例如像素值最大或最小的点、线段的顶点、两直线的交点等,它通常具有一些特征,如灰度值变化较大、梯度变化较大、边缘交汇处等。在计算机视觉领域中,角点通常被用作特征点的一种,用于目标检测、图像配准、三维重建等任务中。

7.1.1 ConvertScaleAbs

CvInvoke.ConvertScaleAbs用于对图像进行线性变换并将结果转换为无符号的8位整型图像。它可以将图像中的像素值进行缩放和偏移,常用于图像增强、特征提取等任务中。该方法的声明如下:

Public Shared Sub ConvertScaleAbs(src As Emgu.CV.IInputArray, dst As Emgu.CV.IOutputArray, scale As Double, shift As Double)

参数说明:

  1. src:要进行线性变换的源图像。
  2. dst:变换后的目标图像。
  3. scale:变换中的缩放比例。
  4. shift:变换中的偏移量。

注意:ConvertScaleAbs方法只能将结果转换为无符号的8位整型图像,如果需要转换为其他类型的图像(比如CV32F、Cv16U等),可以使用CvInvoke.ConvertScale方法。

【代码位置:frmChapter7】Button1_Click

    'ConvertScaleAbs

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

        Dim msrc As New Mat("c:\lessons\lena.jpg", ImreadModes.Color)

        ImageBox1.Image = msrc

        Dim mdst As New Mat

        CvInvoke.ConvertScaleAbs(msrc, mdst, 1.5, 10)

        ImageBox2.Image = mdst

End Sub

输出结果如下图所示:

图7-1 图像线性变换结果

可以看出,ConvertScaleAbs实际有两个作用:1、对图像像素点进行线性变换;2、对于非CV8U的图像,转为CV8U。

7.1.2 Normalize

CvInvoke.Normalize用于对图像进行归一化处理。它可以将图像中的像素值按照一定的规则进行缩放,使得像素值的范围在指定的范围内,常用于图像增强、特征提取等任务中。该方法的声明如下:

Public Shared Sub Normalize(src As Emgu.CV.IInputArray, dst As Emgu.CV.IOutputArray, Optional alpha As Double = 1, Optional beta As Double = 0, Optional normType As Emgu.CV.CvEnum.NormType = 4, Optional dType As Emgu.CV.CvEnum.DepthType = -1, Optional mask As Emgu.CV.IInputArray = Nothing)

参数说明:

  1. src:要进行归一化处理的源图像。
  2. dst:归一化处理后的图像。
  3. alpha:下限范围。
  4. beta:上限范围,只在normType =NormType.MinMax时起作用。。
  5. normType:归一化处理中的算法类型,这是一个NormType枚举类型,可以选择NormType.MinMax、NormType.L1、NormType.L2等。当设置为MinMax时,Normalize()会把原矩阵中的值范围从最小值-最大值,按比例变换到alpha-beta的范围。
  6. dType:归一化处理后的目标图像的深度类型。
  7. mask:可选参数,表示要进行归一化处理的像素点的掩码图像,只有掩码图像中像素值为非零的像素点才会进行归一化处理。

【代码位置:frmChapter7】Button2_Click

    'Normalize

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

        Dim msrc As New Mat("c:\lessons\lena.jpg", ImreadModes.Color)

        ImageBox1.Image = msrc

        Dim mdst As New Mat

        CvInvoke.Normalize(msrc, mdst, 50, 200, NormType.MinMax)

        ImageBox2.Image = mdst

End Sub

输出结果如下图所示:

图7-2 图像归一化处理

7.1.3 CornerHarris

Harris角点检测算法是一种经典的角点检测算法,由Chris Harris和Mike Stephens在1988年提出。该算法通过计算图像中每个像素的响应函数值,来确定图像中的角点位置。

在使用EmguCV进行图像处理时,CvInvoke.CornerHarris方法用于检测图像中的角点。该方法基于Harris角点检测算法,可以识别出图像中的角点位置,其声明如下:

Public Shared Sub CornerHarris(image As Emgu.CV.IInputArray, harrisResponse As Emgu.CV.IOutputArray, blockSize As Integer, Optional apertureSize As Integer = 3, Optional k As Double = 0.04, Optional borderType As Emgu.CV.CvEnum.BorderType = 4)

参数说明:

  1. image:待检测的图像。必须是CV8U或者CV32F的单通道图像。
  2. harrisResponse:输出的角点响应图像,存放Harris评价系数的矩阵,这是一个CV32F的单通道图像,和image图像大小一致。
  3. blockSize:以当前像素为中心的邻域大小。通常是一个大于1的奇数。
  4. apertureSize:Sobel算子的大小。通常是一个大于1的奇数。
  5. k:Harris评价系数的权重系数,通常取值范围为0.04- 0.06。
  6. borderType:边界模式,用于处理图像边界情况。

【代码位置:frmChapter7】Button3_Click

    'CornerHarris

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click

        Dim m As New Mat("c:\lessons\chess.jpg", ImreadModes.Color)

        '获得灰度图像

        Dim mgray As New Mat

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

        ImageBox1.Image = mgray

        '大小同mgray,存放评价系数的CV32F矩阵

        Dim mhr As New Mat

        '检测角点

        CvInvoke.CornerHarris(mgray, mhr, 2, 3, 0.04)

        '归一化处理,之后处理的是存放评价系数的CV32F矩阵

        Dim mn As New Mat

        CvInvoke.Normalize(mhr, mn, 0, 255, NormType.MinMax)

        '图像转为CV8U

        Dim mabs As New Mat

        CvInvoke.ConvertScaleAbs(mn, mabs, 1, 0)

        '二值化

        Dim madp As New Mat

        CvInvoke.Threshold(mabs, madp, 100, 255, ThresholdType.Binary)

        '由于之前二值化了,这里只需要获得非0值的点

        Dim ps As New VectorOfPoint

        CvInvoke.FindNonZero(madp, ps)

        '绘制出角点

        Dim mdst As New Mat

        mdst = m.Clone

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

            CvInvoke.Circle(mdst, ps(i), 20, New MCvScalar(0, 0, 255), -1)

        Next

        ImageBox2.Image = mdst

End Sub

输出结果如下图所示:

图7-3 棋盘上的角点

7.1.4 CornerSubPix

在数字图像处理领域中,亚像素级别(Subpixel Level)指的是比像素级别更细小的精度。像素级别指的是图像上的最小单位,通常是一个正方形的颜色区域。而亚像素级别则指的是像素内部的更细小的精度,例如像素内部的小数点位数。使用亚像素级别的精度可以提高图像处理的精度和准确度。例如,在角点检测任务中,使用亚像素级别的定位可以提高角点定位的精度,从而提高图像特征匹配的准确度。使用亚像素级别的精度需要借助于一些图像处理算法,例如插值算法、滤波算法等。

在使用EmguCV进行图像处理时,CvInvoke.CornerSubPix方法用于在亚像素级别上对角点进行精确化处理。该方法通过迭代优化提高角点的精度和准确性。该方法声明如下:

Public Shared Sub CornerSubPix(image As Emgu.CV.IInputArray, corners As Emgu.CV.IInputOutputArray, win As System.Drawing.Size, zeroZone As System.Drawing.Size, criteria As Emgu.CV.Structure.MCvTermCriteria)

参数说明:

  1. image:待处理的图像。
  2. corners:角点的位置数组,通常是通过CornerHarris等方法检测到的初始角点。这个参数既是输入也是输出。
  3. win:表示搜索窗口的大小。通常是一个大于1的奇数,表示在某个角点周围的邻域内进行亚像素级别的优化。
  4. zeroZone:表示搜索窗口中心的边界区域,通常是一个Size对象,用于将搜索窗口的中心排除在优化过程之外。
  5. criteria:表示优化过程的迭代终止准则,它是一个McvTermCriteria类,可以设置最大迭代次数和最小变化量的阈值。其中:
    1. maxIter:最大迭代次数,当迭代次数达到该值时,迭代终止。
    2. epsilon:迭代精度,当每一步迭代的变化量小于该值时,迭代终止。

下面的代码表示最大迭代次数为30次,每一步迭代的变化量小于0.01时,迭代终止:

Dim criteria As New MCvTermCriteria(30, 0.01)

【代码位置:frmChapter7】Button4_Click、getMax、outputMatdata32F1C、PointFToPoint

'CornerSubPix

    Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click

        Dim m As New Mat("c:\learnEmgucv\chess.jpg", ImreadModes.Color)

        '获得灰度图像

        Dim mgray As New Mat

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

        ImageBox1.Image = mgray

        '大小同mgray,存放评价系数的CV32F矩阵

        Dim mhr As New Mat

        '检测角点

        CvInvoke.CornerHarris(mgray, mhr, 2, 3, 0.04)

        Dim vopf As New VectorOfPointF

        vopf = outputMatdata32F1C(mhr)

        CvInvoke.CornerSubPix(mgray, vopf, New Drawing.Size(5, 5), New Drawing.Size(-1, -1), New MCvTermCriteria(100, 0.01))

        '绘制出角点

        Dim mdst As New Mat

        mdst = m.Clone

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

            CvInvoke.Circle(mdst, PointFToPoint(vopf(i)), 20, New MCvScalar(0, 0, 255), -1)

        Next

        ImageBox2.Image = mdst

    End Sub

    '获得矩阵中的最大值,用来后面计算阈值 '

    Private Function getMax(ByVal m As Mat) As Single

        Dim maxvalues() As Double

        Dim minvalues() As Double

        Dim maxposes() As Point

        Dim minposes() As Point

        '只能查找每个通道的最大值和最小值,而不是查找每个通道的所有最大值和最小值

        '最大值和最小值的位置,也只是返回最先的那个。

        m.MinMax(minvalues, maxvalues, minposes, maxposes)

        '返回矩阵中的最大值

        Return maxvalues(0)

    End Function

    '输出符合条件的点

    Private Function outputMatdata32F1C(ByVal m As Mat) As VectorOfPointF

        '设置阈值

        Dim threshold As Single

        threshold = 0.01 * getMax(m)

        '为了计算方便,将m转为Matrix

        '这里m32F,所以使用Single

        Dim matr As New Matrix(Of Single)(m.Size)

        'MatCopyTo方法

        m.CopyTo(matr)

        Dim corners As New VectorOfPointF

        Dim colcount As Integer = matr.Cols

        Dim rowcount As Integer = matr.Rows

        Dim lstPf As New List(Of PointF)

        For i As Integer = 0 To rowcount - 1

            For j As Integer = 0 To colcount - 1

                Dim outSingle As Single = matr(i, j)

                '存储大于阈值的点坐标

                If outSingle > threshold Then

                    lstPf.Add(New PointF(j, i))

                End If

            Next

        Next

        '获得VectorOfPointF

        corners.Push(lstPf.ToArray)

        Return corners

    End Function

    'PointFPoint方法

    Public Shared Function PointFToPoint(ByVal pf As PointF) As Point

        Return New Point(CInt(pf.X), CInt(pf.Y))

    End Function

输出结果如下图所示:

图7-4 棋盘上的角点

【代码位置:frmChapter7】Button5_Click

    '直接CornerHarrisCornerSubPix的比较

    Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click

        Dim m As New Mat("c:\learnEmgucv\lena.jpg", ImreadModes.Color)

        '获得灰度图像

        Dim mgray As New Mat

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

        '大小同mgray,存放评价系数的CV32F矩阵

        Dim mhr As New Mat

        '检测角点

        CvInvoke.CornerHarris(mgray, mhr, 2, 3, 0.04)

        '设定阈值

        Dim threshold As Single

        threshold = 0.01 * getMax(mhr)

        '二值化,分离不符合阈值的点

        Dim mtsd As New Mat

        CvInvoke.Threshold(mhr, mtsd, threshold, 255, ThresholdType.Binary)

        '获得非0值的点

        Dim ps As New VectorOfPoint

        CvInvoke.FindNonZero(mtsd, ps)

        '绘制出角点

        Dim mdst As New Mat

        mdst = m.Clone

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

            CvInvoke.Circle(mdst, ps(i), 2, New MCvScalar(0, 0, 255), -1)

        Next

        ImageBox1.Image = mdst

        Dim vopf As New VectorOfPointF

        vopf = outputMatdata32F1C(mhr)

        CvInvoke.CornerSubPix(mgray, vopf, New Drawing.Size(5, 5), New Drawing.Size(-1, -1), New MCvTermCriteria(100, 0.01))

        '绘制出角点

        Dim mdst2 As New Mat

        mdst2 = m.Clone

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

            CvInvoke.Circle(mdst2, PointFToPoint(vopf(i)), 2, New MCvScalar(0, 0, 255), -1)

        Next

        ImageBox2.Image = mdst2

End Sub

输出结果如下图所示:

图7-5 直接CornerHarris和CornerSubPix后的比较

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

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

相关文章

【负载均衡式在线OJ】项目设计

文章目录 程序源码用到的技术项目宏观结构代码编写思路 程序源码 https://gitee.com/not-a-stupid-child/online-judge 用到的技术 C STL 标准库。Boost 准标准库(字符串切割)。cpp-httplib 第三方开源网络库。ctemplate 第三方开源前端网页渲染库。jsoncpp 第三方开源序列化…

netty编程之结合springboot一起使用

写在前面 源码 。 本文看下netty结合springboot如何使用。 1:netty server部分 server类(不要main,后续通过springboot来启动咯!): package com.dahuyou.netty.springboot.server;import io.netty.bootstrap.Serve…

Python实现t-分布随机邻域嵌入(t-SNE)降维算法

目录 Python实现t-分布随机邻域嵌入(t-SNE)降维算法的博客引言t-SNE算法原理t-SNE的优势与局限Python实现t-SNE算法1. 创建t-SNE类2. 示例场景:MNIST手写数字数据集3. 结果分析 结论运行结果 Python实现t-分布随机邻域嵌入(t-SNE&…

2024上海初中生古诗文大会备考:单选题真题和每道题独家解析

新学年开学倒计时了,也意味着上海中小学生的几项传统赛事即将拉开帷幕了。 其中,2024年初中生古诗文大会初选还有2个多月(官宣了11月3日线上初选正式开赛),我们来看10道历年的选择题真题和详细解析。为帮助孩子自测和…

模型 KT决策法

系列文章 分享 模型,了解更多👉 模型_思维模型目录。系统分析,明智选择。 1 KT决策法的应用 1.1 餐饮连锁店菜单更新 一家餐饮连锁店计划更新菜单,以吸引更多顾客并提高销售额。使用 KT 决策法(Kepner-Tregoe&#x…

xss-labs靶场通关详解(11-15关)

第11关 referer 进行抓包 添加referer:click me!" type"button" οnmοuseοver"alert(/xss/)进行放包 第12关 进行抓包 修改User Agent:click me!" type"button" οnmοuseοver"alert(/xss/)进行放包 第13关 抓包 修改C…

python可视化-密度图

1、加载数据 import pandas as pd import numpy as np from sklearn.datasets import load_iris import warnings# 禁用所有警告信息 warnings.filterwarnings(ignore)# 加载数据 iris load_iris() iris iris.keys() df pd.DataFrame(iris.data, columnsiris.feature_names)…

mac nvm安装及使用(nvm安装指定版本node npm pnpm)

mac nvm安装及使用(nvm安装指定版本node npm pnpm) 1.卸载电脑的node 打开终端:依次执行以下命令: sudo rm -rf /usr/local/bin/npm sudo rm -rf /usr/local/share/man/man1/node.1 sudo rm -rf /usr/local/lib/dtrace/node.d s…

开源word文档相似度对比 软件WinMerge

WinMerge 官网下载 :GitHub - WinMerge/winmerge: WinMerge is an Open Source differencing and merging tool for Windows. WinMerge can compare both folders and files, presenting differences in a visual text format that is easy to understand and hand…

API网关之Kong

Kong 是一个高性能的开源 API 网关和微服务管理平台,用于管理、保护和扩展 API 和微服务。它最初由 Mashape 公司开发,并于 2015 年作为开源项目发布。Kong 能够处理 API 的路由、认证、负载均衡、缓存、监控、限流等多种功能,是微服务架构中…

网络应用层之(2)DNS协议

网络应用层之(2)DNS协议 Author: Once Day Date: 2024年8月12日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章可参考专栏: 通信网络技术_Once-Day的博客-CSDN…

PyTorch深度学习网络(二:CNN)

卷积神经网络(CNN)是一种专门用于处理具有类似网格结构数据的深度学习模型,例如图像(2D网格的像素)和时间序列数据(1D网格的信号强度)。CNN在图像识别、图像分类、物体检测、语音识别等领域有着…

R语言绘制可用于论文发表的生存曲线图|科研绘图·24-08-25

小罗碎碎念 有关于生存曲线的基本概念(例如删失事件的定义)和绘图的详细教程我已经在5月的推文中介绍过了,有需求的同学欢迎前去考古。 R语言绘制生存分析曲线从概念到实战的保姆级教程|2024-05-12 https://mp.weixin.qq.com/s/Z…

SQL进阶技巧:如何按任意时段分析时间区间问题? | 分区间讨论【左、中、右】

目录 0 场景描述 1 数据准备 2 问题分析 方法1:分情况讨论,找出重叠区间 方法2:暴力美学法。按区间展开成日期明细表 3 拓展案例 4小结 0 场景描述 现有用户还款计划表 user_repayment ,该表内的一条数据,表示用户在指定日期区间内 [date_start, date_end] ,每天…

秋招突击——8/21——知识补充——计算机网络——cookie、session和token

文章目录 引言正文Cookie——客户端存储和管理Session——服务端存储和管理Token补充签名和加密的区别常见的加密算法和签名算法 面试题1、HTTP用户后续的操作,服务端如何知道属于同一个用户?如果服务端是一个集群机器怎么办?2、如果禁用了Co…

【Python 千题 —— 基础篇】简易图书管理系统

Python 千题持续更新中 …… 脑图地址 👉:⭐https://twilight-fanyi.gitee.io/mind-map/Python千题.html⭐ 题目描述 题目描述 编写一个面向对象的程序,模拟一个图书管理系统。要求定义一个 Book 类,具有基本的书籍信息功能;然后,创建一个 Library 类,用于管理多个 B…

Vue3搜索框(InputSearch)

效果如下图:在线预览 APIs InputSearch 参数说明类型默认值width搜索框宽度,单位 pxstring | number‘100%’icon搜索图标boolean | slottruesearch搜索按钮,默认时为搜索图标string | slotundefinedsearchProps设置搜索按钮的属性&#xf…

【Qt】容器类控件GroupBox

容器类控件GroupBox 使用QGroupBox实现一个带有标题的分组框,可以把其他的控件放在里面里面作为一组,这些内部的控件的父元素也就不是this了。 其目的只是为了让界面看起来更加好看,例如当一个界面比较复杂的时候,包含了很多的控…

APP封装安装配置参考说明

APP封装安装配置参考说明 一, 环境准备 宝塔环境 nginx php5.6 mysql5.6 java-openjdk1.8 apktool 1,安装 nginx,php,mysql自行安装 java-openjdk1.8 安装 推荐使用命令行安装 1.1 yum install java-1.8.0-openjdk1.2 yum install -y java-1.8.0-openjdk-devel1.3 设置…

Unity | 性能标准分析工具图形API简介

目录 一、相关术语 1.物理页 2.PSS内存 3.Reserved Total 二、耗时推荐值 三、内存推荐值 四、分析工具 1.Profiler (1)Profiler各平台对比 (2)构建到目标平台 (3)Frame数量修改 (4…