当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python OpenCV drawMatchesKnn()用法及代码示例


OpenCV(开源计算机视觉)是一个免费的开源计算机视觉和机器学习算法库,旨在帮助开发人员构建计算机视觉应用程序。它为图像和视频处理、对象检测和识别、3D 重建等任务提供了广泛的工具和函数。

OpenCV 的主要函数之一是其实时处理图像和视频的能力,使其成为构建需要实时执行对象跟踪和人脸识别等任务的应用程序的重要工具。它还提供了许多machine-learning算法,可用于训练目标检测和分类等任务的模型。

PythonOpenCV库中的drawMatchesKnn()函数用于绘制两幅图像关键点之间的匹配。它需要以下参数

特征检测器是指用于检测图像中的关键点并计算其说明符的方法。有许多不同的特征检测器可用,每种检测器都有自己的优点和缺点。一些常见的特征检测器包括:

每个特征检测器都有一组不同的参数,可以调整这些参数来优化其性能。特征检测器的选择将取决于图像的具体特征和关键点的所需属性。

cv2.drawMatchesKnn(img1,
                   keypoints1,
                   img2,
                   keypoints2,
                   matches,
                   outImg,
                   matchColor=None,
                   singlePointColor=None,
                   matchesMask=None,
                   flags=None)
  • 图像1图像2是您要为其绘制匹配的两个图像。
  • 关键点1关键点2是在每个图像中检测到的关键点列表,由特征检测器返回,例如SIFT或者SURF.
  • 火柴是关键点匹配的列表,由匹配器返回,例如FLANN或者BF匹配器.
  • 输出图像是一个可选的输出图像,将在其上绘制匹配项。如果未提供,将创建一个新图像。
  • 匹配颜色是连接匹配关键点的线的颜色。如果未提供,则默认颜色为绿色。
  • 单点颜色是不属于任何匹配的关键点的颜色。如果未提供,则默认颜色为蓝色。
  • 匹配掩码是一个可选掩码,指定要绘制的匹配项。如果未提供此信息,则所有比赛都将进行平局。
  • 旗帜是控制函数行为的可选标志。 DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS 标志可用于从输出图像中排除单个关键点。
  • 绘制匹配Knn() 函数返回输出图像及其上绘制的匹配项。然后,您可以使用 imshow() 等函数显示图像,如示例中所示。

值得注意的是,drawMatchesKnn() 函数效率不高,对于大量匹配可能会很慢。如果您需要绘制大量火柴,您可能需要考虑使用其他方法,例如使用line()函数手动绘制火柴。

生成的图像的外观将取决于您传递给 drawMatchesKnn() 函数的特定参数,例如线条和关键点的颜色以及指定要绘制的匹配项的掩码。您可以自定义图像的外观以满足您的需求。

值得注意的是,drawMatchesKnn() 函数效率不高,对于大量匹配可能会很慢。如果您需要绘制大量火柴,您可能需要考虑使用其他方法,例如使用line()函数手动绘制火柴。

FLANN(近似最近邻的快速库)是一个用于执行快速近似最近邻搜索的高效库。它可用于查找大型数据集中一组查询点的最近邻居,当数据集太大而无法容纳在内存中时,它特别有用。FLANN 其工作原理是构建一个数据结构(例如KD-tree或分层聚类树),使其能够快速搜索数据集并找到查询点的最近邻居。它返回近似最近邻居,这意味着返回的邻居可能不是真正的最近邻居,但它们会接近真正的最近邻居。

另一方面,BFMatcher 代表暴力匹配器。这是一种简单直接的匹配说明符的方法。它的工作原理是将一组中的每个说明符与另一组中的每个说明符进行比较,并返回具有最小欧几里德距离的匹配项。 BFMatcher 易于使用,并且对于小型数据集有效,但随着数据集变大,它变得低效,因为它必须将每个说明符与其他每个说明符进行比较。这使得它不太适合需要考虑速度的大规模应用。

总之,FLANN 是一种在大型数据集中查找最近邻的更有效方法,而 BFMatcher 是一种更简单的方法,可用于小型数据集。

Python3


import numpy as np 
import cv2 
#from matplotlib import pyplot as plt 
  
  
# load the images 
image1 = cv2.imread('Bhagavad-Gita.jpg') 
image2 = cv2.imread('Geeta.jpg') 
  
# img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) 
# img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) 
  
# Initiate SIFT detector 
sift = cv2.SIFT_create() 
  
# find the keypoints and descriptors with SIFT 
keypoint1, descriptors1 = sift.detectAndCompute(image1, None) 
keypoint2, descriptors2 = sift.detectAndCompute(image2, None) 
  
# finding nearest match with KNN algorithm 
index_params = dict(algorithm=0, trees=20) 
search_params = dict(checks=150)   # or pass empty dictionary 
  
flann = cv2.FlannBasedMatcher(index_params, search_params) 
  
Matches = flann.knnMatch(descriptors1, descriptors2, k=2) 
  
# Need to draw only good matches, so create a mask 
good_matches = [[0, 0] for i in range(len(Matches))] 
  
# Good matches 
for i, (m, n) in enumerate(Matches): 
    if m.distance < 0.5*n.distance: 
        good_matches[i] = [1, 0] 
  
  
# Draw the matches using drawMatchesKnn() 
Matched = cv2.drawMatchesKnn(image1, 
                             keypoint1, 
                             image2, 
                             keypoint2, 
                             Matches, 
                             outImg=None, 
                             matchColor=(0, 155, 0), 
                             singlePointColor=(0, 255, 255), 
                             matchesMask=good_matches, 
                             flags=0
                             ) 
  
# Displaying the image  
cv2.imwrite('Match.jpg', Matched) 

输出:

True
drawMatchKNN- Geeksforgeeks

绘制匹配KNN

该代码首先加载两个图像并使用 SIFT 特征检测器检测关键点和说明符。然后,它使用 FLANN 匹配器查找最近邻居,并使用 Lowe 比率测试过滤匹配项。最后,它使用drawMatchesKnn()函数绘制关键点之间的匹配并显示结果图像。

使用 BFMatcher

Python3


import numpy as np 
import cv2 
  
#load the images 
image1 = cv2.imread('Bhagavad-Gita.jpg')  
image2 = cv2.imread('Geeta.jpg')  
  
#img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) 
#img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) 
  
# Initiate SIFT detector 
sift = cv2.SIFT_create() 
  
# find the keypoints and descriptors with SIFT 
keypoint1, descriptors1 = sift.detectAndCompute(image1, None) 
keypoint2, descriptors2 = sift.detectAndCompute(image2, None) 
  
  
#Initialize the BFMatcher for matching 
BFMatch = cv2.BFMatcher() 
Matches = BFMatch.knnMatch(descriptors1,descriptors2,k=2) 
  
# Need to draw only good matches, so create a mask 
good_matches = [[0,0] for i in range(len(Matches))] 
  
# ratio test as per Lowe's paper 
for i,(m,n) in enumerate(Matches): 
    if m.distance < 0.5*n.distance: 
        good_matches[i]=[1,0] 
          
# Draw the matches using drawMatchesKnn() 
Matched = cv2.drawMatchesKnn(image1,       
                             keypoint1,    
                             image2, 
                             keypoint2, 
                             Matches, 
                             outImg = None, 
                             matchColor = (0,0,255),   
                             singlePointColor = (0,255,255), 
                             matchesMask = good_matches, 
                             flags = 0
                            ) 
  
# Save the image  
cv2.imwrite('BFMatch.jpg', Matched)

输出

True
DrawMatchesKnn with BFMatcher -Geeksforgeeks

DrawMatchesKnn 与 BFMatcher

重要因子

有几个因子会影响drawMatchesKnn的准确性:

  • 关键点和说明符的质量:匹配过程的准确性取决于用于表示图像中特征的关键点和说明符的质量。如果关键点不明显或者说明符不稳健,则很难找到准确的匹配。
  • 特征检测器和说明符提取器的选择:匹配过程的准确性可能会受到特征检测器和说明符提取器的选择的影响。不同的特征检测器和说明符提取器将产生具有不同属性的关键点和说明符,并且某些可能更适合所匹配图像的特定特征。
  • 关键点和说明符的数量:使用的关键点和说明符越多,匹配过程使用的信息就越多,这可以提高匹配的准确性。然而,使用太多的关键点和说明符也会减慢匹配过程。
  • 图像中存在噪声和其他干扰:图像中的噪声和其他干扰会使找到准确的匹配变得更加困难。对图像进行预处理以消除噪声和干扰,有助于提高匹配的准确性。
  • 匹配方式的选择:不同的匹配方法(例如 FLANN 或 BFMatcher)可能具有不同的准确度级别,具体取决于图像的具体特征和所需的匹配属性。


相关用法


注:本文由纯净天空筛选整理自rohit2sahu大神的英文原创作品 Python OpenCV – drawMatchesKnn() Function。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。