openCV 图像特征点检测与匹配

这篇具有很好参考价值的文章主要介绍了openCV 图像特征点检测与匹配。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、应用场景

        1.图像搜索,以图搜图。

        2.拼图游戏。

        3.图像拼接,将两张有关联的图拼接在一起。

二、基础概念

2.1 什么是图像特征?

        图像特征就是指有意义的图像区域,具有独特性、易于识别性,比如角点、斑点以及高密度区。

openCV 图像特征点检测与匹配

         从上图我们可以发现:

        A、B两图我们很难找到具体定位;

        C、D两图可以找到一些相似区域,但不太容易确定;

        E、F两图则很容易确定其定位,即特征信息丰富。

        由此,我们可以知道角点是非常重要的特征信息。

2.2 角点

        (1)在特征中最重要的是角点;

        (2)灰度梯度的最大值对应的像素点;

        (3)两条线的交点;

        (4)极值点(一阶导数最大值,但二阶导数为0)。

三、特征检测

3.1 角点检测

3.1.1 Harris角点检测

openCV 图像特征点检测与匹配

  • 光滑地区,无论向哪个移动,衡量系数不变
  • 边缘地区,垂直边缘移动时,衡量系统剧烈变化
  • 在交点处,往那个方向移动,衡量系统都发生剧烈变化

    Harris角点检测API

  • cornerHarrris(img,dst,blockSize,ksize,k)
  • blockSize: 检测窗口大小
  • ksize: Sobel的卷积核
  • k 权重系数,经验值,一般取0.02-0.04之间
import cv2
import numpy as np

# 读取图片
img = cv2.imread('./chess.png')

# 灰度化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# Harris角点检测
dst = cv2.cornerHarris(gray, blockSize=2, ksize=3, k=0.04)

# Harris角点的展示
img[dst > 0.01*dst.max()] = (0, 0, 255)

cv2.imshow('Harris', img)
cv2.waitKey(0)

3.1.2 Shi-Tomasi角点检测

  • shi- tomasi是Harris角点检测的改进
  • Harris角点检测算的稳定性和k有关,而k是个经验值,不好设定最佳值

   Shi-Tomasi角点检测API

  • goodFeaturesToTrack(img,maxCorners,…)
  • maxCorners:角点的最大数,值为0表示无限制
  • qualityLevel:小于1.0的正数,一般在0.01-0.1之间
  • minDistance:角之间最小欧式距离,忽略小于此距离的点
  • mask: 感兴趣的区域
  • blockSize:检测窗口
  • useHarrisDectector:是否使用Harris算法
  • k :默认是0.04
import cv2
import numpy as np

img = cv2.imread('./chess.png')

# 灰度化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 角点检测
corners = cv2.goodFeaturesToTrack(gray, maxCorners=1000, qualityLevel=0.01, minDistance=10,)
corners = np.int0(corners)

# Shi-Tomasi绘制角点
for i in corners:
    x,y = i.ravel()
    cv2.circle(img, (x,y), 3, (0,0,255),-1)


cv2.imshow('Shi-Tomasi', img)
cv2.waitKey(0)

3.1.3 检测效果展

openCV 图像特征点检测与匹配openCV 图像特征点检测与匹配openCV 图像特征点检测与匹配   

                          图1 原图                                                   图2 Harris角点检测                                      图3  Shi-Tomasi角点检测

3.2关键点与描述子

  • 关键点:位置,大小和方向
  • 关键点描述子:记录了关键点周围对其有贡献的像素点的一组向量值,其不受仿射变换、光照变换等的影响

3.2.1 SIFT(Scale-Invariant Feature Transfrom)特征检测

   SIFT出现的原因

  • Harris 角点具有旋转不变的特性,但缩放后,原来的角点有可能就不是角点了,如下图所示:

openCV 图像特征点检测与匹配

   使用SIFT的步骤

  • 创建SIFT对象,sift = cv2.SIFT_create()
  • 进行检测,kp = sift.detect(img,…)
  • 绘制关键点,drawKeypoints(gray, kp, img)

  计算描述子

  • kp,des=sift.compute(img,kp)
  • 其作用就是进行特征匹配

   同时计算关键点和描述子的API

  • kp,des=sift.detectAndCompute(img,…)
  • mask:指明对img中哪个区域进行计算

3.2.2 SURF(Speeded-Up Robust Features)特征检测

  SURF的优点 

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

  使用SURF的步骤

  • surf = cv2.xfeatures2d.SURF_create()
  • kp, des = surf.detectAndCompute(img, mask)

3.2.3 ORB(Orirnted FAST and Rotated BRIEF)特征检测

  ORB的优点 

  • 可以实现实时检测
  • ORB = Orirnted FAST + Rotated BRIEF,即是两种技术的结合
  • FAST 可以做到特征点的实时检测
  • BRIEF 对已经检测到的特征点进行描述,加快了特征点描述符建立的速度,同时也极大的降低了特征匹配的时间

  使用ORB的步骤

  • orb = cv2.ORB_create()
  • kp,des =orb.detectAndCompute(img,mask)

3.2.4 代码及检测效果

import cv2
import numpy as np

# 读文件
img = cv2.imread('chess.png')
# 灰度化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 创建sift对象,进行检测
sift = cv2.SIFT_create()
kp,des = sift.detectAndCompute(gray, None)

# 创建SURF对象,进行检测
# surf = cv2.xfeatures2d.SURF_create()
# kp,des = surf.detectAndCompute(gray, None)

# 创建ORB对象,进行检测
# orb = cv2.ORB_create()
# kp,des = orb.detectAndCompute(gray, None)


# print(des)

# 绘制keypoints
cv2.drawKeypoints(gray, kp, img)

cv2.imshow('img', img)
cv2.waitKey(0)

openCV 图像特征点检测与匹配openCV 图像特征点检测与匹配openCV 图像特征点检测与匹配

                             图1 原图                                                    图2 SIFT特征检测                                        图3  ORB特征检测

四、特征匹配

4.1 BF(Brute-Force)暴力特征匹配方法

  暴力特征匹配方法的原理(枚举)

  • 它使用第一组中的每个特征的描述子,与第二组中的所有特征描述子进行匹配
  • 计算他们之间的差距,然后将最接近一个匹配返回(也即计算他们之间的相似度)

  openCV特征匹配的步骤

  • 创建匹配器,BFMatcher(normType, crossCheck)
  • 进行特征匹配,bf.match(des1,des2)
  • 绘制匹配点,cv2.drawMatches(img1,kp1,img2,k2)
import cv2
import numpy as np

# 读取图片
img1 = cv2.imread('2.jpg')
img2 = cv2.imread('1.jpg')
# # 灰度化
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)

# 检测特征点+描述子
sift = cv2.SIFT_create()  # 创建SIFT对象
kp1, des1 = sift.detectAndCompute(gray1, None)   # 对整个图像进行检测,掩码设为None
kp2, des2 = sift.detectAndCompute(gray2, None)   # 对整个图像进行检测,掩码设为None

# 创建匹配器
bf = cv2.BFMatcher(cv2.NORM_L1)
match = bf.match(des1, des2)    # 获得匹配点
res = cv2.drawMatches(img1, kp1, img2, kp2, match, None)   # 绘制匹配点

# cv.drawKeypoints(gray, kp, img)  # 绘制特征点

# # 显示图像

cv2.imshow('BF', res)
cv2.waitKey(0)

4.2 FLANN最快邻近区特征匹配方法

   FLANN优缺点

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

  使用FLANN特征匹配的步骤

  • 创建FLANN匹配器,FlannBasedMatcher(…)
  • 进行特征匹配,flann.match/knnMatch(…)
  • 绘制匹配点,cv.drawMatches/drawMatchesKnn(…)
import cv2
import numpy as np

# 读取图片
img1 = cv2.imread('2.jpg')
img2 = cv2.imread('1.jpg')

# 灰度化
gray1 = cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)

# 创建sift特征匹配器
sift = cv2.SIFT_create()
# 计算描述子与特征点
kp1, des1 = sift.detectAndCompute(gray1, None)
kp2, des2 = sift.detectAndCompute(gray2, None)

# 创建匹配器
index_params = dict(algorithm=1, trees=5)
search_params = dict(checks=50)
flann = cv2.FlannBasedMatcher(index_params, search_params)

# 对描述子进行匹配
matches = flann.knnMatch(des1, des2, k=2)
good = []
for i, (m, n) in enumerate(matches):
    if m.distance < 0.7*n.distance:
        good.append(m)

# 绘制匹配点
ret = cv2.drawMatchesKnn(img1,kp1,img2,kp2,[good],None)
cv2.imshow('FLANN', ret)
cv2.waitKey(0)

 4.3 特征匹配效果图

openCV 图像特征点检测与匹配openCV 图像特征点检测与匹配 

                                             图1 BF暴力特征匹配                                                                 图2 FLANN特征匹配

注:内容来自慕课网李超老师的视频课程整理。文章来源地址https://www.toymoban.com/news/detail-494470.html

到了这里,关于openCV 图像特征点检测与匹配的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 004 OpenCV akaze特征点检测匹配

    目录 一、环境 二、akaze特征点算法 2.1、基本原理 2.2、实现过程 2.3、实际应用 2.4、优点与不足 三、代码 3.1、数据准备 3.2、完整代码 本文使用环境为: Windows10 Python 3.9.17 opencv-python 4.8.0.74 特征点检测算法AKAZE是一种广泛应用于图像处理领域的算法,它可以在不同尺度下提取

    2024年02月02日
    浏览(28)
  • Opencv(C++)学习系列---特征点检测和匹配

    关于特征检测和匹配的具体原理会在后续的文章中具体讲解,本文主要介绍Opencv实现的简单过程: 第一步:定义特征检测器(SIFT,SURF,ORB等)。 第二步:对图像中特征点进行检测,并将特征点存储在Keypoints中。 第三步:提取特征点的描述信息。 第四步:定义特征匹配器(特

    2024年02月04日
    浏览(26)
  • python opencv orb特征点提取匹配然后图像拼接

    opencv 基于ORB特征点图像拼接_特征点 warpperspective-CSDN博客 图像用这儿的 右边多出了一部分黑色的,应该是重复部分的宽

    2024年01月19日
    浏览(33)
  • 【计算机视觉、关键点检测、特征提取和匹配】基于SIFT、PCA-SIFT和GLOH算法在不同图像之间建立特征对应关系,并实现点匹配算法和图像匹配(Matlab代码实现)

    💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码、数据、文章

    2024年03月14日
    浏览(38)
  • opencv 进阶16-基于FAST特征和BRIEF描述符的ORB(图像匹配)

    在计算机视觉领域,从图像中提取和匹配特征的能力对于对象识别、图像拼接和相机定位等任务至关重要。实现这一目标的一种流行方法是 ORB(Oriented FAST and Rotated Brief)特征检测器和描述符。ORB 由 Ethan Rublee 等人开发,结合了两种现有技术的优势——FAST(加速分段测试特征

    2024年02月11日
    浏览(25)
  • openCV实战-系列教程7:轮廓检测2与模板匹配(轮廓检测/轮廓特征/轮廓近似/轮廓边界矩阵/轮廓边界圆/模版匹配)、原理解析、源码解读

    打印一个图片可以做出一个函数: 前面我们计算了这个图片的轮廓:  它的轮廓信息保存在了contours中,取出第一个轮廓,计算相关参数: 打印结果: 8500.5  437.9482651948929 这是分别求出了周长和面积,这里的True表示的是否是闭合的。    如图,第一个图是原图,如果将它的

    2024年02月10日
    浏览(29)
  • 特征点的检测与匹配(ORB,SIFT,SURFT比较)[opencv-python]

    本文旨在总结opencv-python上特征点的检测和匹配。 1、特征点的检测(包括:ORB,SIFT,SURFT) 2、特侦点匹配方法 (包括:暴力法,FLANN,以及随机抽样一致性优化RANSAC算法) 注:由于SURF专利问题,所以opencv官方包目前不支持SURF但支持ORB和SIFT,安装opencv-contrib-python包就可以解决 一

    2024年02月06日
    浏览(35)
  • OpenCV图像特征提取学习五,HOG特征检测算法

    一、HOG向梯度直方图概述   向梯度直方图(Histogram of Oriented Gradient, HOG)特征是基于对稠密网格中归一化的局部方向梯度直方图的计算。此方法的基本观点是:局部目标的外表和形状可以被局部梯度或边缘方向的分布很好的描述,即使我们不知道对应的梯度和边缘的位置。在

    2024年02月04日
    浏览(33)
  • openCV 第四篇 角点检测、图像特征、图片拼接

    本文原本打算直接简单介绍一下harris和sift,之后进行特征匹配,来一波图像拼接。 想来想去还是先介绍下原理吧,虽然没人看QAQ。可以直接点击右侧目录跳转到代码区。 角点检测  和  图像特征提取(就几行代码) 以及进行图像拼接代码,来完成如下操作: 上图我们可以清楚

    2024年01月17日
    浏览(38)
  • opencv案例06-基于opencv图像匹配的消防通道障碍物检测与深度yolo检测的对比

    技术背景 消防通道是指在各种险情发生时,用于消防人员实施营救和被困人员疏散的通道。消防法规定任何单位和个人不得占用、堵塞、封闭消防通道。事实上,由于消防通道通常缺乏管理,导致各种垃圾,物品以及车辆等障碍物常常出现在消防通道中,堵塞消防通道,当险

    2024年02月03日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包