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

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

我们使用尺度不变特征变换( 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实现两张图片的特征匹配

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

示例

在该示例中,我们使用 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实现两张图片的特征匹配

例子

在此示例中,我们使用 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实现两张图片的特征匹配

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

Python OpenCV