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 检测器和 暴力 匹配器匹配两幅图像的关键点。
输入图像
下面的图像是我们在以下示例中使用的输入文件。
示例
在该示例中,我们使用 SIFT 算法检测两张输入图像的关键点和描述符,并使用暴力匹配算法匹配描述符。我们还绘制了最佳50个关键点匹配结果。在此示例中,我们向 drawMatches() 传递 flags=2 来绘制匹配结果。
输出
在执行时,它将产生以下 输出 -
例子
在此示例中,我们使用 SIFT 算法检测两个输入图像的关键点和描述符,并使用基于 Brute Force 的 匹配器 以将描述符匹配。另外,我们绘制最佳的50个关键点匹配项。在本示例中,我们传递标志= 0给 drawMatches() 以绘制匹配项。
输出
在执行时,将会生成以下 输出 −