OpenCV Python – 使用SIFT实现两张图片的特征匹配

OpenCV Python – 使用SIFT实现两张图片的特征匹配_第1张图片

 我们使用尺度不变特征变换( SIFT )特征描述符和暴力匹配算法实现两张图像的特征匹配。其中, SIFT 用于找到图像中的关键点和描述符,而 暴力匹配算法 用于在两张图像中匹配描述符。

实现步骤

要使用 SIFT 特征检查器和 暴力 匹配算法实现两张图像的特征匹配,可以按照以下步骤操作−

  • 导入必要的库 OpenCV、Matplotlib和NumPy 。确保您已安装它们。

  • 使用灰度图像的 cv2.imread() 读取两张输入图像。指定图像的完整路径。

  • 使用 sift=cv2.SIFT_create() 方法初始化SIFT对象,设置默认值。

  • 使用 sift.detectAndCompute() 方法分别在两张输入图像中检测和计算关键点’kp1’和’kp2’以及描述符’des1’和’des2’。

  • 创建一个BFmatcher对象 bf=cv2.BFMatcher() 并使用其 bf.match(des1,des2) 方法匹配描述符。它会返回匹配结果。按距离对所有匹配进行排序。

  • 使用 cv2.drawMatches() 方法在原始输入图像上绘制匹配结果。

  • 以可选方式,可以使用BFmatcher对象的方法 bf.knnMatch(des1,des2,k=2) 来匹配描述符,应用比率测试来获取最佳匹配结果,使用 cv2.drawMatchesKnn() 方法来绘制匹配结果。

  • 可视化关键点匹配结果。

让我们通过一些示例来看如何使用 SIFT 检测器和 暴力 匹配器匹配两幅图像的关键点。

输入图像

下面的图像是我们在以下示例中使用的输入文件。

OpenCV Python – 使用SIFT实现两张图片的特征匹配_第2张图片

OpenCV Python – 使用SIFT实现两张图片的特征匹配_第3张图片

示例

在该示例中,我们使用 SIFT 算法检测两张输入图像的关键点和描述符,并使用暴力匹配算法匹配描述符。我们还绘制了最佳50个关键点匹配结果。在此示例中,我们向 drawMatches() 传递 flags=2 来绘制匹配结果。

# 导入所需的库
import numpy as np
import cv2
import matplotlib.pyplot as plt

# 将两个输入图像读取为灰度图像
img1 = cv2.imread('bmw.jpg',0)
img2 = cv2.imread('bmw-rotated.jpg',0)

# 初始化 SIFT 检测器
sift = cv2.SIFT_create()

# 检测和计算具有 SIFT 的关键点和描述符
kp1, des1 = sift.detectAndCompute(img1,None)
kp2, des2 = sift.detectAndCompute(img2,None)

# 创建 BFMatcher 对象
bf = cv2.BFMatcher()

# 匹配描述符。
matches = bf.match(des1,des2)

# 基于距离对匹配项进行排序
matches = sorted(matches, key=lambda val: val.distance)

# 绘制前50个匹配项。
out = cv2.drawMatches(img1, kp1, img2, kp2, matches[:50], None, flags=2)
plt.imshow(out), plt.show()

输出

在执行时,它将产生以下 输出 -

OpenCV Python – 使用SIFT实现两张图片的特征匹配_第4张图片

例子

在此示例中,我们使用 SIFT 算法检测两个输入图像的关键点和描述符,并使用基于 Brute Force 的 匹配器 以将描述符匹配。另外,我们绘制最佳的50个关键点匹配项。在本示例中,我们传递标志= 0给 drawMatches() 以绘制匹配项。

# 导入需要的库
导入 numpy 作为 np
导入 cv2
导入 matplotlib.pyplot 作为 plt

# 读取两个灰度输入图像
img1 = cv2.imread('bmw.jpg',0) # 第一张图像
img2 = cv2.imread('bmd-rotated.jpg',0) # 第二张图像

# 初始化SIFT检测器
sift = cv2.SIFT_create()

# 使用SIFT检测器检测和计算关键点和描述子
kp1, des1 = sift.detectAndCompute(img1,None)
kp2, des2 = sift.detectAndCompute(img2,None)

# 创建BFMatcher对象
bf = cv2.BFMatcher()
matches = bf.knnMatch(des1,des2, k=2)

# 应用比值测试
good = []
for m,n in matches:
   if m.distance < 0.1*n.distance:
      good.append([m])

# cv2.drawMatchesKnn需要一个列表的列表作为匹配列表
img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,None,flags=0)
plt.imshow(img3),plt.show()

输出

在执行时,将会生成以下 输出 −

OpenCV Python – 使用SIFT实现两张图片的特征匹配_第5张图片

 为帮助更多对人工智能感兴趣的小伙伴们能够有效的系统性的学习以及论文的研究,小编特意制作整理了一份人工智能学习资料给大家,整理了很久,非常全面。

大致内容包括一些人工智能基础入门视频和文档+AI常用框架实战视频、计算机视觉、机器学习、图像识别、NLP、OpenCV、YOLO、pytorch、深度学习与神经网络等学习资料、课件源码、国内外知名精华资源、以及AI热门论文等全套学习资料。
OpenCV Python – 使用SIFT实现两张图片的特征匹配_第6张图片

 需要以上这些文中提到的资料,请点击此处→【人工智能全套完整VIP资料】即可免费获取。

看完三件事❤️

  • 如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  • 关注作者公众号 『 python深度学习NLP 』,不定期分享原创知识。
  • 关注后回复【666】扫码即可获取学习资料包。
  • 同时可以期待后续文章ing。

OpenCV Python – 使用SIFT实现两张图片的特征匹配_第7张图片

 

你可能感兴趣的:(Opencv,opencv,人工智能,计算机视觉,机器学习,神经网络,深度学习,自然语言处理)