应用OpenCV和Python进行筛算法的实现详解

  

  

如下图为进行测试的gakki101和gakki102,分别验证基于BFmatcher, FlannBasedMatcher等的筛选算法,对比其优劣。为体现出匹配效果对于旋转特性的优势,将图gakki101做成具有旋转特性的效果。

  

应用OpenCV和Python进行筛算法的实现详解

  

  

BFmatcher(强力匹配)暴力匹配,应用BFmatcher。knnMatch()函数来进行核心的匹配,knnMatch(再分类)k近邻分类算法。
  

  

资讯算法则是从训练集中找到和新数据最接近的k条记录,然后根据他们的主要分类来决定新数据的类别。该算法涉及3个主要因素:训练集,距离或相似的衡量,k的大小.kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。
  

  

资讯方法在类别决策时,只与极少量的相邻样本有关。由于资讯方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,然而,方法较其他方法更为适合。
  经检验BFmatcher在做匹配时会耗费大量的时间。
  

  

代码段如下:

        进口numpy np   进口cv2   从matplotlib进口pyplot plt      imgname1=' E:/其他/gakki101.jpg '   imgname2=' E:/其他/gakki102.jpg '      筛?cv2.xfeatures2d.SIFT_create ()      img1=cv2.imread (imgname1)   gray1=cv2。cvtColor (img1 cv2.COLOR_BGR2GRAY) #灰度处理图像   kp1 des1=sift.detectAndCompute (img1 None) # des是描述子      img2=cv2.imread (imgname2)   gray2=cv2。cvtColor (img2 cv2.COLOR_BGR2GRAY) #灰度处理图像   kp2 des2=sift.detectAndCompute (img2 None) # des是描述子      hmerge=np。hstack ((gray1 gray2)) #水平拼接   cv2。imshow(“灰色”,hmerge) #拼接显示为灰色   cv2.waitKey (0)      img3=cv2.drawKeypoints (img1 kp1 img1,颜色=(255、0255)#画出特征点,并显示为红色圆圈   img4=cv2.drawKeypoints (img2, kp2 img2,颜色=(255、0255)#画出特征点,并显示为红色圆圈   hmerge=np。hstack ((img3 img4)) #水平拼接   cv2。imshow(“点”,hmerge) #拼接显示为灰色   cv2.waitKey (0)   # BFMatcher解决匹配   男朋友=cv2.BFMatcher ()   匹配=男朋友。knnMatch (des1 des2 k=2)   #调整比   好的=[]   在匹配m, n:   如果m。距离& lt;0.75 * n.distance:   good.append ([m])      img5=cv2.drawMatchesKnn (img1 kp1 img2, kp2,比赛,没有,标志=2)   cv2。img5 imshow (“BFmatch”)   cv2.waitKey (0)   cv2.destroyAllWindows ()      

首先是针对图像的灰度化显示:

  

应用OpenCV和Python进行筛算法的实现详解

  

之后完成特征点的标注,用红色圆圈表示:

  

应用OpenCV和Python进行筛算法的实现详解

  

在cv2.drawMatchesKnn (img1、kp1 img2, kp2,比赛,没有,标志=2)下的匹配效果,比较杂乱,且会出错。

  

应用OpenCV和Python进行筛算法的实现详解

  

如果更换为cv2.drawMatchesKnn (img1、kp1 img2, kp2,好,没有,标志=2),明显优于上面的匹配,并且为预想的匹配区域,其效果为:
  

  

应用OpenCV和Python进行筛算法的实现详解

  

<>强基于FlannBasedMatcher的筛选实现

  

FLANN (Fast_Library_for_Approximate_Nearest_Neighbors)快速最近邻搜索包,它是一个对大数据集和高维特征进行最近邻搜索的算法的集合,而且这些算法都已经被优化过了。在面对大数据集时它的效果要好于BFMatcher。
  经验证,FLANN比其他的最近邻搜索软件快10倍。使用FLANN匹配,我们需要传入两个字典作为参数。这两个用来确定要使用的算法和其他相关参数等。
  

  

第一个是<代码> IndexParams>   <代码> index_params=dict(算法=FLANN_INDEX_KDTREE树=5)
  这里使用的是KTreeIndex配置索引,指定待处理核密度树的数量(理想的数量在1 - 16)。

应用OpenCV和Python进行筛算法的实现详解