OpenCV4特征匹配

一.特征检测的基本概念

OpenCV特征的场景

  • 1.图像搜索,如以图搜图
  • 2.拼图游戏
  • 3.图像拼接,将两张有关联的图拼接到一起

特征点匹配就是在不同的图像中寻找同一个物体的同一个特征点。因为每个特征点都具有标志着唯一身份和特点的描述子,因此特征点匹配其实就是在两个图像中寻找具有相似描述子的两个特征点。根据描述子特点的不同,寻找两个相似描述子的方法也不尽相同,总体上可以总结为两类:
第一类是计算两个描述子之间的欧氏距离,这种匹配方式的特征点有SIFT特征点、SURF特征点等;
第二类是计算两个描述子之间的汉明距离,这种匹配方式的特征点有ORB特征点、BRJSK特征点等。

角点

  • 1.在特征中最重要的是角点
  • 2.灰度梯度的最大值对应的像素
  • 3.两条线的交点

二.Harris角点检测

Harris角点检测API

cornerHarris(img, dst, blockSize, kernel_size, k)
- blockSize: 检测窗口大小
- kernel_size: Sobel的卷积核
- k: 权重系数,经验值,一般取0.02~0.04之间

三.Shi-Tomasi角点检测

  • 1.Shi-Tomasi是Harris角点检测的改进
  • 2.Harris角点检测算法的稳定性和k有关,而k是一个经验值

四.SIFT关键点检测

SIFT(Scale-Invariant Feature Transform)

SIFT出现的原因
虽然Harris角点具有旋转不变的特征,但缩放后,原来的角点有可能就检测不到了

使用SIFT的步骤

  • 1.创建SIFT对象
  • 2.进行检测
  • 3.绘制关键点,drawKeypoints

五.SURF特征检测(属于opencv_contrib)

SURF(Speeded-Up Robust Features)

SIFT最大的问题是速度慢,因此才有了SURF

六.ORB特征检测

ORB(Oriented FAST and Rotated BRIEF)

ORB可以做到实时监测

七.特征匹配方法

模板匹配:模板匹配是一种最原始、最基本的模式识别方法,研究某一特定对象物的图案位于图像的什么地方,进而识别对象物,这就是一个匹配问题。它是图像处理中最基本、最常用的匹配方法。模板匹配具有自身的局限性,主要表现在它只能进行平行移动,若原图像中的匹配目标发生旋转或大小变化,该算法无效
特征匹配:所谓特征匹配FBM(Feature-Based Matching),就是指将从影像中提取的特征作为共轭实体,而将所提特征属性或描述参数(实际上是特征的特征,也可以认为是影像的特征)作为匹配实体,通过计算匹配实体之间的相似性测度以实现共轭实体配准的影像匹配方法。在匹配目标发生旋转或大小变化时,该算法依旧有效

  • 1.BF(Brute-Force):暴力特征匹配方法
  • 2.FLANN:最快邻近区特征匹配方法

类似于VisionMaster中的高精度匹配和快速匹配

暴力特征匹配原理
它使用第一组中的每个特征的描述子,与第二组中的所有特征描述子进行匹配,计算它们之间的差距,然后将最接近的一个匹配返回

OpenCV特征匹配步骤

  • 1.创建匹配器:BFMatcher(normType, crossCheck)
  • 2.进行特征匹配:bf.match(des1, des2)
  • 3.绘制匹配点:drawMatches()

八.FLANN特征匹配

FLANN优缺点

  • 1.在进行批量特征匹配时,FLANN速度更快
  • 2.由于它使用的是邻近近似值,所以精度较差

流程梳理

在这里插入图片描述

在C#中使用OpenCV进行特征匹配是一个涉及计算机视觉和图像处理的过程。这通常包括以下步骤: 1. 特征检测:首先需要从图像中提取关键点(特征点),这些关键点在图像中是独特的,并且能够抵抗旋转、缩放和其他变化。OpenCV提供了多种特征检测器,如SIFT、SURF、ORB等。 2. 特征描述:对于每一个检测到的关键点,计算一个描述符(特征描述子),这个描述符描述了关键点周围的局部图像区域。这些描述符用于后续的匹配过程。 3. 特征匹配:使用一些匹配算法,如FLANN匹配器或BFMatcher(暴力匹配器),根据特征描述子在两幅图像之间寻找相似的特征点对。匹配的结果可以用来估计图像之间的几何变换,或者进行对象识别等。 在C#中,你可以使用Emgu CV库,这是一个基于OpenCV的跨平台.NET封装库,提供了对OpenCV功能的访问。以下是一个简单的例子,展示了如何使用Emgu CV进行特征匹配: ```csharp // 初始化ORB特征检测器 var detector = new ORB(); // 使用检测器找到关键点和描述子 KeyPoint[] keypoints1 = null; FeatureDescriptor[] features1 = null; detector.DetectAndCompute(img1, null, out keypoints1, out features1); KeyPoint[] keypoints2 = null; FeatureDescriptor[] features2 = null; detector.DetectAndCompute(img2, null, out keypoints2, out features2); // 创建匹配器 BFMatcher matcher = new BFMatcher(DistanceType.L2); // 匹配两个图像的特征描述子 MatchesArray matches = matcher.Match(features1, features2); // 根据距离排序匹配结果 matches = matches.OrderBy(m => m.Distance).ToArray(); // 可视化匹配结果 Mat matchImage = new Mat(); CvInvoke.DrawMatches(img1, keypoints1, img2, keypoints2, matches, matchImage); // 显示结果 CvInvoke.Imshow("Matches", matchImage); CvInvoke.WaitKey(0); ``` 在上述代码中,`img1`和`img2`是需要匹配的两幅图像,`matches`数组包含了匹配的结果。使用`DrawMatches`方法将匹配结果显示在一个新图像上,然后使用`Imshow`方法显示出来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

boss-dog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值