EmguCV学习笔记 VB.Net 7.2 特征点检测

news2024/9/29 18:02:00

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

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.2 特征点检测

在EmguCV中,特征点通常使用Features2D命名空间下的类进行检测和提取,常用的特征点检测算法包括FAST、SIFT、SURF、ORB等。使用这些算法可以在图像中提取出关键点和特征描述子,进而用于图像匹配、目标跟踪、三维重建等领域。

7.2.1 Features2DToolbox类        

Features2DToolbox类提供了静态方法来绘制特征点和特征点连线。由于此类需要依赖于其他方法获得特征点或特征描述子,因此关于本节中介绍的Features2DToolbox类相关方法具体的例子,请看后面的章节。

7.2.1.1 DrawKeypoints

Features2Dtoolbox的DrawKeypoints方法用于在图像上绘制关键点。该函数可以将检测到的关键点绘制在图像上,以便进行可视化和分析。

函数的定义如下:

Public Shared Sub DrawKeypoints(image As Emgu.CV.IInputArray, keypoints As Emgu.CV.Util.VectorOfKeyPoint, outImage As Emgu.CV.IInputOutputArray, color As Emgu.CV.Structure.Bgr, Optional type As Emgu.CV.Features2D.Features2DToolbox.KeypointDrawType = 0)

参数说明:

  1. image:要绘制关键点的图像。
  2. keypoints:要绘制的关键点,通常是通过SIFT、SURF、ORB等算法检测到的关键点。
  3. outImage:输出图像,通常是一个Mat对象,用于绘制关键点。
  4. color:绘制关键点的颜色,通常是一个MCvScalar对象,表示颜色的BGR值。
  5. type:绘制关键点的方式,通常是一个Features2DToolbox.KeypointDrawType枚举值,可以选择绘制关键点的位置、方向、大小等信息。它包括如下成员:
    1. KeypointDrawType.Default:绘制圆形。
    2. KeypointDrawType.DrawRichKeypoints:绘制带方向和大小信息的关键点。

7.2.1.2 DrawMatches

Features2Dtoolbox的DrawMatches方法用于绘制特征点匹配结果的函数,它可以将两幅图像中的匹配特征点连接起来,并将连接线绘制到一张新的图像中。常用声明如下:

Public Shared Sub DrawMatches(modelImage As Emgu.CV.IInputArray, modelKeypoints As Emgu.CV.Util.VectorOfKeyPoint, observedImage As Emgu.CV.IInputArray, observedKeyPoints As Emgu.CV.Util.VectorOfKeyPoint, matches As Emgu.CV.Util.VectorOfDMatch, result As Emgu.CV.IInputOutputArray, matchColor As Emgu.CV.Structure.MCvScalar, singlePointColor As Emgu.CV.Structure.MCvScalar, Optional mask As Emgu.CV.Util.VectorOfByte = Nothing, Optional flags As Emgu.CV.Features2D.Features2DToolbox.KeypointDrawType = 0)

参数说明:

  1. modelImage:模型图像。
  2. modelKeypoints:模型图像的特征点,类型为VectorOfKeyPoint。
  3. observedImage:匹配图像。
  4. observedKeyPoints:匹配图像的特征点,类型为VectorOfKeyPoint。
  5. matches:两幅图像中的匹配特征点,类型为VectorOfDMatch或者VectorOfVectorOfDMatch。
  6. result:输出图像,用于存储绘制结果。
  7. matchColor:用于绘制匹配线的颜色,类型为MCvScalar。
  8. singlePointColor:用于绘制特征点的颜色,类型为MCvScalar。
  9. mask:绘制掩码。
  10. flags:绘制标志,用于控制绘制的方式,类型为Features2DToolbox.DrawMatchesFlags枚举类型。

7.2.1.3 VoteForUniqueness

Feature2DToolbox类的VoteForUniqueness方法实现特征匹配的进一步优化,去除重复匹配和错误匹配,保留唯一匹配结果。该方法声明如下:

Public Shared Sub VoteForUniqueness(matches As Emgu.CV.Util.VectorOfVectorOfDMatch, uniquenessThreshold As Double, mask As Emgu.CV.Mat)

参数说明:

  1. matches:需要筛选的特征点,VectorOfVectorOfDMatch变量
  2. uniquenessThreshold:阈值,取值范围为0到1之间,一般设置为0.8或0.9。
  3. mask:输入输出矩阵,这是一个Row=matches.Size、Col=1的矩阵。输入的时候,指定哪些特征点需要进行唯一性计算。如果某个特征点的mask值为0,则不进行计算。通常设置为MCvScalar(255)。输出的时候,获得唯一性矩阵,其中唯一的特征点对应的像素值为255,非唯一的特征点对应的像素值为0。

7.2.1.4 VoteForSizeAndOrientation

VoteForSizeAndOrientation方法用于计算匹配的特征点之间的大小和方向的一致性得分,从而去除可能的错误匹配。该方法声明如下:

Public Shared Function VoteForSizeAndOrientation(modelKeyPoints As Emgu.CV.Util.VectorOfKeyPoint, observedKeyPoints As Emgu.CV.Util.VectorOfKeyPoint, matches As Emgu.CV.Util.VectorOfVectorOfDMatch, mask As Emgu.CV.Mat, scaleIncrement As Double, rotationBins As Integer) As Integer

参数说明:

  1. modelKeyPoints:模型图像中的特征点,VectorOfKeyPoint类型。
  2. observedKeyPoints:匹配图像中的特征点,VectorOfKeyPoint类型。
  3. matches:匹配的特征点,VectorOfVectorOfDMatch类型。
  4. mask:蒙版。输入是VoteForUniqueness方法获得的mask。输出为大小和方向一致性得分矩阵,其中唯一的特征点对应的像素值为255,非唯一的特征点对应的像素值为0。
  5. scaleIncrement:缩放值,通常设置为1.5。
  6. rotationBins:匹配可旋转点的数量,通常设置为20。

返回值:

Mask中非0元素的个数。

7.2.1.5 GetHomographyMatrixFromMatchedFeatures

GetHomographyMatrixFromMatchedFeatures方法用于计算两幅图像中匹配的特征点之间的单应性矩阵,从而实现图像的配准和拼接。该方法声明如下:

Public Shared Function GetHomographyMatrixFromMatchedFeatures(model As Emgu.CV.Util.VectorOfKeyPoint, observed As Emgu.CV.Util.VectorOfKeyPoint, matches As Emgu.CV.Util.VectorOfVectorOfDMatch, mask As Emgu.CV.Mat, ransacReprojThreshold As Double) As Emgu.CV.Mat

参数说明:

  1. model:模型图像中的特征点,VectorOfKeyPoint类型。
  2. observed:匹配图像中的特征点,VectorOfKeyPoint类型。
  3. matches:匹配的特征点,VectorOfVectorOfDMatch类型。
  4. mask:蒙版。输入通常是VoteForUniqueness方法或者VoteForSizeAndOrientation方法获得的mask,也可以手动设置。
  5. ransacReprojThreshold:RANSAC算法中的二次投影误差阈值,一般为1到10之间。

返回值:

返回单应性矩阵,如果找不到,则返回Nothing。

7.2.2 SIFT类 

EmguCV中的SIFT类是使用SIFT (Scale-Invariant Feature Transform)算法进行特征点检测和描述子生成的工具。SIFT算法是一种基于尺度空间极值检测和高斯差分图像描述子的算法,具有较高的特征检测精度和描述子匹配准确性,它可以在不同尺度和旋转角度下检测和描述图像中的特征点,由于其良好的尺度不变性和旋转不变性,被广泛应用于计算机视觉领域。SIFT算法原本申请了专利需要许可才能使用,但现在SIFT算法的专利已经到期。

SIFT类提供了以下方法来检测特征点和获得特征描述:

1、Detect方法

Detect方法使用SIFT特征检测器检测了图像中的SIFT特征点,并将检测结果保存在MKeyPoint类型数组变量中。

MKeyPoint类表示一个特征点,包含了该特征点的位置、尺度、方向等信息。

2、DetecRaw方法

DetecRaw方法同Detect方法,但是它将检测结果保存在VectorOfKeyPoint类型变量中。

VectorOfKeyPoint类表示一个特征点向量,可以用于管理和操作多个特征点,常用于特征点的提取、保存、加载、匹配等操作。

3、Compute方法

Compute方法用于在给定的图像和对应特征点处提取特征描述子,将提取结果保存在Mat类型变量中。

特征描述子包含了描述关键点周围区域的一组数值,可以用于比较、匹配和识别关键点。在使用SIFT算法提取特征描述子时,特征描述子保存在一个Mat类型变量中,该Mat的大小是“关键点的数量×128”,对应Mat的“行×列”,每个关键点为一行,128表示每个特征描述子包含128个数值,这些数值表示了关键点周围区域的特征信息,可以用于描述和区分不同的关键点。

4、DetectAndCompute方法

DetectAndCompute方法是Detect方法和Compute方法的集成,可以返回图像中的SIFT关键点和特征描述子。

参数说明:

  1. image:输入图像,类型为`Mat`。
  2. mask:掩膜图像,用于指定特征点的提取范围。该参数通常设置为Nothing。
  3. keypoints:提取到的特征点,类型为VectorOfKeyPoint。
  4. descriptors:计算得到的特征描述子,类型为Mat。
  5. useProvidedKeypoints:是否使用输入的特征点进行计算。当为False时,既要检测关键点,又要计算特征描述子;否则只获得特征描述子。

【代码位置:frmChapter7】Button6_Click

    '获得特征关键点

    Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click

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

        Dim sift As New Features2D.SIFT

        Dim vkp As New VectorOfKeyPoint

        sift.DetectRaw(msrc, vkp)

        '绘制关键点

        Dim m1 As Mat = msrc.Clone

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

            CvInvoke.Circle(m1, PointFToPoint(vkp(i).Point), 3, New MCvScalar(0, 0, 255), -1)

        Next

        ImageBox1.Image = m1

        Dim mkp() As MKeyPoint

        mkp = sift.Detect(msrc)

        '绘制关键点

        Dim m2 As Mat = msrc.Clone

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

            CvInvoke.Circle(m2, PointFToPoint(mkp(i).Point), 3, New MCvScalar(0, 0, 255), -1)

        Next

        ImageBox2.Image = m2

End Sub

输出结果如下图所示:

图7-6 获得关键点比较

通过以下方法获得特征描述子

【代码位置:frmChapter7】Button7_Click

    '获得特征描述子

    Private Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.Click

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

        Dim sift As New Features2D.SIFT

        '使用DetectRaw方法来获得特征点,返回一个VectorOfKeyPoint

        Dim vkp1 As New VectorOfKeyPoint

        sift.DetectRaw(msrc, vkp1)

        '获得特征描述子

        Dim mdst1 As New Mat

        sift.Compute(msrc, vkp1, mdst1)

        '或者采用DetectAndCompute方法来获得特征描述子

        Dim vkp2 As New VectorOfKeyPoint

        Dim mdst2 As New Mat

        sift.DetectAndCompute(msrc, Nothing, vkp2, mdst2, False)

End Sub

输出结果如下图所示:

图7-7 获得特征描述子

查看输出的特征描述子Mat,可以看到lena图像的关键点一共1110(Rows),Mat宽度128。特征描述子具体的使用参看后面。

7.2.3 BFMatcher类

EmguCV中的BFMatcher类是一个Brute-Force Matcher(暴力匹配器),用于在两个特征描述子集合之间进行匹配。BFMatcher类提供了两种匹配方法:暴力匹配和k近邻匹配,可以根据实际需求选择合适的方法。

BFMatcher类的主要方法为Match方法,可以接受两个特征描述子集合并返回它们之间的匹配结果。另外,该类还提供了一些其他的属性和方法,用于设置匹配算法的参数和获取匹配结果。

下面是BFMatcher类的常用方法和属性:

1. Match方法:在两个特征描述子集合之间进行匹配。

2. KnnMatch方法:使用k近邻算法在两个特征描述子集合之间进行匹配。

3. MatchType属性:设置匹配算法的类型。

4. CrossCheck属性:设置是否使用交叉验证。

7.2.3.1 Match

Match方法是在两个特征描述子集合之间进行匹配的函数,它的声明如下:

Public Sub Match(queryDescriptors As Emgu.CV.IInputArray, trainDescriptors As Emgu.CV.IInputArray, matches As Emgu.CV.Util.VectorOfDMatch, Optional mask As Emgu.CV.IInputArray = Nothing)

该函数接受三个参数:

  1. queryDescriptors:查询图像的特征描述子,类型为Mat。
  2. trainDescriptors:训练图像的特征描述子,类型为Mat。
  3. matches:VectorOfDMatch类型。其中每个Dmatch结构表示每个查询描述子和其最佳匹配的训练描述子之间的匹配结果,它有三个主要属性:
    1. QueryIdx:对应查询图像查询描述子的索引。
    2. TrainIdx:对应训练图像描述子的索引。
    3. Distance:两个描述子之间的距离,越小表明匹配度越高。
  4. mask:掩膜图像,用于指定匹配的范围,类型为Mat。

【代码位置:frmChapter7】Button8_Click

    '特征点匹配

    Private Sub Button8_Click(sender As Object, e As EventArgs) Handles Button8.Click

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

        Dim m2 As New Mat("c:\learnEmgucv\lena_keypoint.jpg", ImreadModes.AnyColor)

        Dim SIFT1 As New Features2D.SIFT

        Dim des1 As New Mat

        Dim vkp1 As New VectorOfKeyPoint

        SIFT1.DetectAndCompute(m1, Nothing, vkp1, des1, False)

        Dim m1c As Mat = m1.Clone

        '使用Circle标记特征点

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

            CvInvoke.Circle(m1c, PointFToPoint(vkp1(i).Point), 3, New MCvScalar(0, 0, 255), -1)

        Next

        ImageBox1.Image = m1c

        Dim SIFT2 As New Features2D.SIFT

        Dim des2 As New Mat

        Dim vkp2 As New VectorOfKeyPoint

        SIFT2.DetectAndCompute(m2, Nothing, vkp2, des2, False)

        Dim m2c As Mat = m2.Clone

        '使用DrawKeypoints标记特征点

        Features2DToolbox.DrawKeypoints(m2c, vkp2, m2c, New Bgr(0, 0, 255))

        ImageBox2.Image = m2c

        Dim matches As New VectorOfDMatch

        Dim matcher As New BFMatcher(DistanceType.L2)

        '进行匹配

        matcher.Match(des2, des1, matches)

        Console.WriteLine("匹配成功特征点数目:" & matches.Size)

        Dim outimg As New Mat

        '绘制将特征点连接起来

        '需要注意MatchDrawMatches参数的顺序

        Emgu.CV.Features2D.Features2DToolbox.DrawMatches(

            m1, vkp1, m2, vkp2, matches, outimg, New MCvScalar(0, 0, 255), New MCvScalar(0, 255, 0))

        ImageBox3.Image = outimg

End Sub

输出结果如下图所示:

图7-8 图像特征点匹配

【代码位置:frmChapter7】Button9_Click

   '特征点匹配 采用一定算法对特征点进行筛选

    Private Sub Button9_Click(sender As Object, e As EventArgs) Handles Button9.Click

        ……

        Dim lstGoodMatches As New List(Of MDMatch)

        Dim goodMatches As New VectorOfDMatch

        '采用一定算法对特征点进行筛选

        For i As Integer = 0 To matches.Size - 2

            If matches(i).Distance < 0.7 * matches(i + 1).Distance Then

                lstGoodMatches.Add(matches(i))

            End If

        Next

        goodMatches.Push(lstGoodMatches.ToArray)

        Dim outimg As New Mat

        Emgu.CV.Features2D.Features2DToolbox.DrawMatches(

            m1, vkp1, m2, vkp2, goodMatches, outimg, New MCvScalar(0, 0, 255), New MCvScalar(0, 255, 0))

        ImageBox3.Image = outimg

End Sub

输出结果如下图所示:

图7-9 使用一定算法优化后的图像特征点匹配

7.2.3.2 knnMatch

knnMatch方法实现暴力匹配算法中的K近邻匹配(K-Nearest Neighbor Matching)。它用于在两个特征描述子集合之间进行K近邻匹配,并返回每个查询描述子和其最佳匹配的K个训练描述子之间的匹配结果。该方法声明如下:

Public Sub KnnMatch(queryDescriptors As Emgu.CV.IInputArray, trainDescriptors As Emgu.CV.IInputArray, matches As Emgu.CV.Util.VectorOfVectorOfDMatch, k As Integer, Optional mask As Emgu.CV.IInputArray = Nothing, Optional compactResult As Boolean = False)

该函数接受五个参数:

  1. queryDescriptors:查询图像的特征描述子,类型为Mat。
  2. trainDescriptors:训练图像的特征描述子,类型为Mat。
  3. matches:VectorOfDMatch类型。
  4. k:每个查询描述子在训练描述子集合中寻找的最佳匹配结果数目,但是实际匹配中获得的数目可能会小于k。
  5. mask:掩膜图像,用于指定匹配的范围,默认所有描述子都将进行匹配。
  6. compactResult:是否输出紧凑格式。False时,输出的匹配结果为DMatch对象列表,每个DMatch对象包含了一个查询特征点和一个训练特征点之间的距离和索引。True时,输出的匹配结果为紧凑格式的匹配结果,它是一个二维整数数组,每个元素为一个查询特征点的k个最近邻训练特征点的索引。默认为False。

【代码位置:frmChapter7】Button10_Click

    '特征点匹配 KnnMatch

    Private Sub Button10_Click(sender As Object, e As EventArgs) Handles Button10.Click

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

        Dim m2 As New Mat("c:\learnEmgucv\lena_keypoint.jpg", ImreadModes.AnyColor)

        Dim SIFT1 As New Features2D.SIFT

        Dim des1 As New Mat

        Dim vkp1 As New VectorOfKeyPoint

        SIFT1.DetectAndCompute(m1, Nothing, vkp1, des1, False)

        Dim m1c As Mat = m1.Clone

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

            CvInvoke.Circle(m1c, PointFToPoint(vkp1(i).Point), 3, New MCvScalar(0, 0, 255), -1)

        Next

        ImageBox1.Image = m1c

        Dim SIFT2 As New Features2D.SIFT

        Dim des2 As New Mat

        Dim vkp2 As New VectorOfKeyPoint

        SIFT2.DetectAndCompute(m2, Nothing, vkp2, des2, False)

        Dim m2c As Mat = m2.Clone

        Features2DToolbox.DrawKeypoints(m2c, vkp2, m2c, New Bgr(0, 0, 255))

        ImageBox2.Image = m2c

        Dim matches As New VectorOfVectorOfDMatch

        Dim matcher As New BFMatcher(DistanceType.L2)

        '使用KnnMatch匹配

        matcher.KnnMatch(des2, des1, matches, 3)

        Dim outimg As New Mat

        Emgu.CV.Features2D.Features2DToolbox.DrawMatches(

            m1, vkp1, m2, vkp2, matches, outimg, New MCvScalar(0, 0, 255), New MCvScalar(0, 255, 0), Nothing)

        ImageBox3.Image = outimg

End Sub

输出结果如下图所示:

图7-10 图像特征点匹配

【代码位置:frmChapter7】Button11_Click

    '特征点匹配 采用一定算法对特征点进行筛选

    Private Sub Button11_Click(sender As Object, e As EventArgs) Handles Button11.Click

        ……

        Dim matches As New VectorOfVectorOfDMatch

        Dim matcher As New BFMatcher(DistanceType.L2)

        matcher.KnnMatch(des2, des1, matches, 3)

        '获得最小距离

        Dim lstLastMatches As New List(Of MDMatch)

        Dim min_dist As Double = 100

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

            If matches(i)(0).Distance < min_dist Then

                min_dist = matches(i)(0).Distance

            End If

        Next

        Dim goodMatches As New VectorOfVectorOfDMatch()

        '采用一定算法对特征点进行筛选

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

            If matches(i)(0).Distance < 2 * min_dist Then

                goodMatches.Push(matches(i))

            End If

        Next

        Dim outimg As New Mat

        Emgu.CV.Features2D.Features2DToolbox.DrawMatches(

            m1, vkp1, m2, vkp2, goodMatches, outimg, New MCvScalar(0, 0, 255), New MCvScalar(0, 255, 0), Nothing)

        ImageBox3.Image = outimg

End Sub

输出结果如下图所示:

图7-11 使用一定算法优化后的图像特征点匹配

【代码位置:frmChapter7】Button12_Click

    '图像匹配

    Private Sub Button12_Click(sender As Object, e As EventArgs) Handles Button12.Click

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

        Dim m2 As New Mat("c:\learnEmgucv\lena_keypoint.jpg", ImreadModes.AnyColor)

        Dim SIFT1 As New Features2D.SIFT

        Dim des1 As New Mat

        Dim vkp1 As New VectorOfKeyPoint

        SIFT1.DetectAndCompute(m1, Nothing, vkp1, des1, False)

        Dim m1c As Mat = m1.Clone

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

            CvInvoke.Circle(m1c, PointFToPoint(vkp1(i).Point), 3, New MCvScalar(0, 0, 255), -1)

        Next

        ImageBox1.Image = m1c

        Dim SIFT2 As New Features2D.SIFT

        Dim des2 As New Mat

        Dim vkp2 As New VectorOfKeyPoint

        SIFT2.DetectAndCompute(m2, Nothing, vkp2, des2, False)

        Dim m2c As Mat = m2.Clone

        Features2DToolbox.DrawKeypoints(m2c, vkp2, m2c, New Bgr(0, 0, 255))

        ImageBox2.Image = m2c

        Dim matches As New VectorOfVectorOfDMatch

        Dim matcher As New BFMatcher(DistanceType.L2)

        matcher.KnnMatch(des2, des1, matches, 3)

        Dim mask As New Mat(matches.Size, 1, DepthType.Cv8U, 1)

        mask.SetTo(New MCvScalar(255))

        '进一步优化特征匹配

        Features2DToolbox.VoteForUniqueness(matches, 0.8, mask)

        '去除可能的错误匹配

        Features2DToolbox.VoteForSizeAndOrientation(vkp1, vkp2, matches, mask, 1.5, 20)

        '得到模板和匹配图片的仿射矩阵

        Dim mtrans As New Mat

        mtrans = Features2DToolbox.GetHomographyMatrixFromMatchedFeatures(vkp1, vkp2, matches, mask, 3)

        '得到模板图像矩形区域

        Dim rec As New Rectangle(Point.Empty, m1.Size)

        '提取模板图像矩形区域的四个顶点,为后面定位匹配图像做准备

        Dim pts(3) As PointF

        pts(0) = New PointF(rec.Left, rec.Bottom)

        pts(1) = New PointF(rec.Right, rec.Bottom)

        pts(2) = New PointF(rec.Right, rec.Top)

        pts(3) = New PointF(rec.Left, rec.Top)

        '定位匹配图像

        pts = CvInvoke.PerspectiveTransform(pts, mtrans)

        'PointF() to Point()

        Dim points() As Point = Array.ConvertAll(pts, New Converter(Of PointF, Point)AddressOf PointFToPoint))

        '绘制

        Dim vp As New VectorOfPoint(points)

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

            CvInvoke.Polylines(m2, vp, True, New MCvScalar(255, 0, 0), 4)

        Next

        CvInvoke.Imshow("m2", m2)

End Sub

输出结果如下图所示:

图7-12 图像匹配

7.2.4 Feature2D命名空间

Feature2D命名空间是EmguCV中用于处理图像特征的命名空间。该命名空间包含了多个类和方法,可以用于检测、提取和匹配图像特征。该命名空间中有两个重要的基类:

1、Feature2D类

Feature2D类是一个抽象类,用于定义检测和提取图像特征的接口。该类包含了多个方法,包括Detect方法、Compute方法和ComputeDescriptors方法等。具体的特征检测和提取算法都是通过Feature2D类的派生类来实现的,例如SIFT、ORB等。

2、XFeature2D类

XFeature2D类是EmguCV中用于实现新型特征算法的类,它包含了多种高级特征算法,如FREAK、LATCH和DAISY等。XFeature2D类的特征算法通常比feature2d类更高级、更复杂,具有更好的性能和效果。

Feature2D命名空间提供的图像特征类的使用请参考7.2.2 【SIFT类】

这里以AKAZE算法为例

【代码位置:frmChapter7】Button13_Click

    'AKAZE

    Private Sub Button13_Click(sender As Object, e As EventArgs) Handles Button13.Click

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

        Dim m2 As New Mat("c:\learnEmgucv\lena_keypoint.jpg", ImreadModes.AnyColor)

        Dim AKAZE1 As New Features2D.AKAZE

        Dim des1 As New Mat

        Dim vkp1 As New VectorOfKeyPoint

        AKAZE1.DetectAndCompute(m1, Nothing, vkp1, des1, False)

        Dim m1c As Mat = m1.Clone

        '使用Circle标记特征点

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

            CvInvoke.Circle(m1c, PointFToPoint(vkp1(i).Point), 3, New MCvScalar(0, 0, 255), -1)

        Next

        ImageBox1.Image = m1c

        Dim AKAZE2 As New Features2D.AKAZE

        Dim des2 As New Mat

        Dim vkp2 As New VectorOfKeyPoint

        AKAZE2.DetectAndCompute(m2, Nothing, vkp2, des2, False)

        Dim m2c As Mat = m2.Clone

        '使用DrawKeypoints标记特征点

        Features2DToolbox.DrawKeypoints(m2c, vkp2, m2c, New Bgr(0, 0, 255))

        ImageBox2.Image = m2c

        Dim matches As New VectorOfDMatch

        Dim matcher As New BFMatcher(DistanceType.L2)

        '进行匹配

        matcher.Match(des2, des1, matches)

        Console.WriteLine("匹配成功特征点数目:" & matches.Size)

        Dim outimg As New Mat

        '绘制将特征点连接起来

        '需要注意MatchDrawMatches参数的顺序

        Emgu.CV.Features2D.Features2DToolbox.DrawMatches(

            m1, vkp1, m2, vkp2, matches, outimg, New MCvScalar(0, 0, 255), New MCvScalar(0, 255, 0))

        ImageBox3.Image = outimg

End Sub

输出结果如下图所示:

图7-13 AKAZE算法实现的特征点匹配

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

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

相关文章

(24)(24.6) 基于OSD的参数菜单

文章目录 前言 1 Copter默认屏幕 2 Plane默认屏幕 3 实例 前言 这允许使用 ArduPilot 机载 OSD 和 RC 发射机的杆输入设置和调整参数。还有两个额外的 OSD 屏幕可用&#xff08;OSD5 和 OSD6&#xff09;&#xff0c;每个屏幕有 9 个“插槽”来保存参数。屏幕首先显示一组…

taro ui 小程序at-calendar日历组件自定义样式+选择范围日历崩溃处理

taro ui 日历文档 目录 单选标记时间&#xff1a; 效果&#xff1a; template&#xff1a; data&#xff1a; methods: 日历--范围选择&#xff1a; 效果&#xff1a; template&#xff1a; data&#xff1a; methods&#xff1a; 日历--间隔多选&#xff1a;利用标…

详细分析python中QRCode生成二维码的基本知识(附Demo)

目录 前言1. 基本知识2. Demo3. 彩蛋3.1 文件路径3.2 Image.LANCZOS 前言 以下主要利用python中的QRCode来生成二维码的基本知识 1. 基本知识 简单易用&#xff0c;并且可以生成高质量的二维码图像 支持多种自定义设置&#xff0c;例如二维码的大小、边框、容错级别、颜色等…

java在项目中实现excel导入导出

一、初识EasyExcel* 1. Apache POI 先说POI&#xff0c;有过报表导入导出经验的同学&#xff0c;应该听过或者使用。 Apache POI是Apache软件基金会的开源函式库&#xff0c;提供跨平台的Java API实现Microsoft Office格式档案读写。但是存在如下一些问题&#xff1a; 1.1 …

C语言阴阳迷宫

目录 开头程序程序的流程图程序游玩的效果下一篇博客要说的东西 开头 大家好&#xff0c;我叫这是我58。 程序 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <Windows.h> enum WASD {W…

【传输层协议】TCP协议(上) {TCP协议段格式;确认应答机制;超时重传机制;连接管理机制:三次握手、四次挥手}

TCP&#xff08;Transmission Control Protocol&#xff09;是一种面向连接的、可靠的、基于字节流的传输层协议&#xff0c;用于在网络上可靠地传输数据。TCP是互联网协议套件&#xff08;TCP/IP&#xff09;中的一个主要协议&#xff0c;它在IP&#xff08;Internet Protocol…

基于STM32开发的智能恒温系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 系统初始化温度检测与恒温控制OLED显示与状态提示Wi-Fi通信与远程监控应用场景 家庭环境的智能恒温管理实验室或工业环境的精确温度控制常见问题及解决方案 常见问题解决方案结论 1. 引言 智…

VIVADO自定义 IP封装

简介 本章节主要针对VIVAO 2020.2版本做IP自定义封装&#xff0c;其中涉及到IP寄存器读写配置&#xff0c;自定义接口封装等介绍。 IP封装 IP标准自定义步骤一般有创建工程&#xff0c;封装IP&#xff0c;自定义内容&#xff0c;添加自定义库这4个步骤&#xff0c;下面…

探秘紫白洋桔梗花语:勇气、爱情、希望与清晰的象征解读

在缤纷多彩的花卉世界中&#xff0c;紫白洋桔梗宛如一位神秘而优雅的仙子&#xff0c;悄然绽放着独特的魅力。它那淡雅的色彩与别致的花形&#xff0c;令人一见倾心&#xff0c;而其背后蕴含的丰富花语&#xff0c;更是如同隐藏的宝藏一般&#xff0c;等待着我们去细细探寻与解…

蓝花楹花语探秘:从宁静忧郁到等待爱情的深刻寓意

在时光的长河中&#xff0c;有一种花朵宛如梦幻的精灵&#xff0c;每当它绽放之时&#xff0c;那一片绚烂的蓝紫色便如同璀璨的星空倾洒人间&#xff0c;它就是蓝花楹。蓝花楹那独特的身姿和醉人的色彩&#xff0c;仿佛自带一种神秘的魔力&#xff0c;吸引着无数人驻足凝望。而…

vue3+ts+vite+electron+electron-store+electron-builder打包可安装包

yarn create vite yarn add electron yarn add electron-store yarn add electron-builder 新增main.js、preload.js // main.js const { app, BrowserWindow, ipcMain, globalShortcut } require(electron) const path require(path) let store // 我们将在稍后动态导入 el…

Flink优化之--旁路缓存和异步IO

Apache Flink 是一个开源流处理框架&#xff0c;以其高吞吐量、低延迟和事件驱动的处理能力著称。随着大数据和实时处理需求的不断增加&#xff0c;Flink 在许多行业和应用场景中得到了广泛应用&#xff0c;如金融风控、物联网数据处理、实时数据分析等。然而&#xff0c;随着数…

如何学习Linux性能优化?

你是否也曾跟我一样&#xff0c;看了很多书、学了很多Linux性能工具&#xff0c;但在面对Linux性能问题时&#xff0c;还是束手无策&#xff1f;实际上&#xff0c;性能分析和优化始终是大多数软件工程师的一个痛点。但是&#xff0c;面对难题&#xff0c;我们真的就无解了吗&a…

2.11键盘事件

目录 实验原理 实验代码 实验结果 实验原理 简单、常用的键盘事件是等待按键事件&#xff0c;它由 waitKey 函数来实现。无论是刚开始学习 OpenCV&#xff0c;还是使用 OpenCV 进行开发调试&#xff0c;都可以看到waitKey 函数的身影&#xff0c;然而基础的东西往往容易忽略…

[Java]MyBatis轻松拿下

介绍 在业务开发过程中, 都是使用java程序完成数据库的操作, 目前最主流的技术就是MyBatis MyBatis是一款优秀的 持久层 框架&#xff0c;用于简化JDBC的开发。 官网: https://mybatis.org/mybatis-3/zh/index.htmlmybatis是Apache的一个开源项目iBatis, 2010年迁移到了googl…

Day00_场景题

文章目录 资料项目经历技能清单自我介绍QPS和TPS?如何设计一个排行榜的功能?如何解决大文件上传问题延时任务处理场景如何设计一个秒杀系统?分布式幂等性如何设计?如果你的系统的QPS 突然提升10倍你会怎么设计?如何从零搭建 10 万级QPS 大流量、高并发优惠券系统?高 QPS,…

OpenCV绘图函数(9)填充多边形函数fillPoly()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 填充一个或多个多边形轮廓所包围的区域。 函数 cv::fillPoly 填充由若干个多边形轮廓所包围的区域。该函数可以填充复杂的区域&#xff0c;例如带…

【大模型】GPT系列模型基础

前言&#xff1a;GPT整体上与transformer结构相似&#xff0c;但只用了decoder部分。 目录 1. GPT2. GPT23. GPT34. 知识补充4.1 下游任务实现方式4.2 sparse attention 1. GPT 预训练&#xff1a;无监督&#xff0c;根据前k个词预测下一个词的概率。微调&#xff1a; 有监督&a…

AI嵌入式人工智能开发 --- 【1】初始RKNPU

目录 一、NPU的由来 二、RKNPU介绍 三、RKNPU单核框架 3.1 AHB/AXI 接口 3.2 卷积神经网络加速单元&#xff08;CNA&#xff09; 3.3 数据处理单元&#xff08;Data Processing Unit&#xff0c;DPU&#xff09; 3.4 平面处理单元&#xff08;Planar Processing Unit&a…

#驱动开发

内核模块 字符设备驱动 中断、内核定时器 裸机开发和驱动开发的区别&#xff1f; 裸机开发 驱动开发&#xff08;基于内核&#xff09; 相同点 都能够控制硬件&#xff08;本质&#xff1a;操作寄存器&#xff09; 不同点 用C语言给对应的地址里面写值 按照一定的框架格式…