【Python+OpenCV】特征点匹配之cv2.FlannBasedMatcher

广告位:

图像拼接论文精读专栏 —— 图像拼接领域论文全覆盖(包含数据集),省时省力读论文,带你理解晦涩难懂的论文算法,学习零散的知识和数学原理,并学会写图像拼接领域的论文(介绍、相关工作、算法、实验、结论、并附有参考文献,不用一篇一篇文章再找)

图像拼接论文源码精读专栏 —— 图像拼接有源码的论文全覆盖(有的自己复现),帮助你通过源码进一步理解论文算法,助你做实验,跑出拼接结果,得到评价指标RMSE、SSIM、PSNR等,并寻找潜在创新点和改进提升思路。

超分辨率重建专栏 —— 从SRCNN开始,带你读论文,写代码,复现结果,找创新点,完成论文。手把手教,保姆级攻略。帮助你顺利毕业,熟练掌握超分技术。

有需要的同学可以点上面链接看看。



Flann简介

Flann(Fast_Library_for_Approximate_Nearest_Neighbors):快速最近邻搜索库,应该是目前OpenCV中封装的用于特征匹配的最好的匹配器了。

函数原型

import cv2

flann = cv2.FlannBasedMatcher(index_params, search_params)

参数及返回值说明:

  • index_params:字典类型,字典中的值是所选算法参数。如:选择随机kd树,平行搜索
FLANN_INDEX_KDTREE = 1
index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)

可选算法如下:

FLANN_INDEX_LINEAR = 0
FLANN_INDEX_KDTREE = 1
FLANN_INDEX_KMEANS = 2
FLANN_INDEX_COMPOSITE = 3
FLANN_INDEX_KDTREE_SINGLE = 4
FLANN_INDEX_HIERARCHICAL = 5
FLANN_INDEX_LSH = 6
FLANN_INDEX_SAVED = 254
FLANN_INDEX_AUTOTUNED = 255

由算法参数都是大写可知,传入的是常数,上面就是不同算法对应的常数。

算法参数含义解释
FLANN_INDEX_LINEAR = 0线性暴力(brute-force)搜索
FLANN_INDEX_KDTREE = 1随机kd树,平行搜索。默认trees=4
FLANN_INDEX_KMEANS = 2层次k均值树。默认branching=32,iterations=11,centers_init = CENTERS_RANDOM, cb_index =0.2
FLANN_INDEX_COMPOSITE = 3随机kd树和层次k均值树来构建索引。默认trees =4,branching =32,iterations =11,centers_init = CENTERS_RANDOM,cb_index =0.2
FLANN_INDEX_LSH = 6multi-probe LSH方法

注:有的文章里算法名和常数值对应是错误的,虽然也能运行但是是错误的。

  • 字典类型,默认dict(checks=32, eps=0, sorted=True)
    其中,checks为int型,是遍历的次数,一般只改变这个参数。

  • 返回值:返回一个匹配器对象,进而调用match方法完成特征点匹配。<FlannBasedMatcher 000002A2F133C510>

代码举例

import numpy as np
import cv2
import matplotlib.pyplot as plt
 
img1 = cv2.imread(r'D:/apap/temple/2.jpg')
img2 = cv2.imread(r'D:/apap/temple/3.jpg')

#可以添加nfeatures参数限定点的个数 
sift = cv2.xfeatures2d.SIFT_create()
 
kp1, des1 = sift.detectAndCompute(img1, None)
kp2, des2 = sift.detectAndCompute(img2, None)
 
FLANN_INDEX_KDTREE = 1 # kd树
index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
search_params = dict(checks=50)   # or pass empty dictionary
 
flann = cv2.FlannBasedMatcher(index_params, search_params)
 
matches = flann.knnMatch(des1, des2, k=2)
 
# Need to draw only good matches, so create a mask
matchesMask = [[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.7*n.distance:
        matchesMask[i] = [1, 0]
        
draw_params = dict(matchColor=(0, 255, 0),
                   singlePointColor=(255, 0, 0),
                   matchesMask=matchesMask,
                   flags=0)
 
img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, matches, None, **draw_params)

plt.figure(figsize=(20,20)); 
plt.imshow(img3, cmap='gray'), plt.title('Matched Result'), plt.axis('off')
plt.show()

实验结果

在这里插入图片描述

  • 9
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
OpenCV是一个功能强大的计算机视觉库,提供了很多用于图像处理和计算机视觉任务的函数和工具。其中一个重要的功能是特征点检测和匹配特征点是图像中的局部区域,具有独特的外观和几何结构。它们可以用于许多计算机视觉任务,如图像配准、目标跟踪和3D重建等。OpenCV提供了几种特征点检测算法,包括SIFT、SURF和ORB等。 特征点匹配是将两个图像中的特征点进行匹配的过程,以找出它们之间的对应关系。OpenCV提供了几种特征点匹配算法,包括暴力匹配和FLANN匹配等。 下面是一个使用OpenCV进行特征点检测和匹配的示例代码: ```python import cv2 # 读取两张图片 img1 = cv2.imread('img1.jpg') img2 = cv2.imread('img2.jpg') # 创建SIFT特征检测器 sift = cv2.xfeatures2d.SIFT_create() # 在两张图片中检测特征点 kp1, des1 = sift.detectAndCompute(img1, None) kp2, des2 = sift.detectAndCompute(img2, None) # 创建FLANN匹配器 FLANN_INDEX_KDTREE = 1 index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5) search_params = dict(checks=50) flann = cv2.FlannBasedMatcher(index_params, search_params) # 使用FLANN匹配器进行特征点匹配 matches = flann.knnMatch(des1, des2, k=2) # 筛选出优秀的匹配点 good_matches = [] for m, n in matches: if m.distance < 0.7 * n.distance: good_matches.append(m) # 在两张图片中绘制匹配点 img_matches = cv2.drawMatches(img1, kp1, img2, kp2, good_matches, None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS) # 显示结果 cv2.imshow('Matches', img_matches) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在上面的示例代码中,我们使用SIFT特征检测器检测两张图片中的特征点,并使用FLANN匹配器进行特征点匹配。最后,我们筛选出优秀的匹配点,并在两张图片中绘制它们。运行代码后,你将看到匹配点的图像显示在屏幕上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十小大

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值