广告位:
图像拼接论文精读专栏 —— 图像拼接领域论文全覆盖(包含数据集),省时省力读论文,带你理解晦涩难懂的论文算法,学习零散的知识和数学原理,并学会写图像拼接领域的论文(介绍、相关工作、算法、实验、结论、并附有参考文献,不用一篇一篇文章再找)
图像拼接论文源码精读专栏 —— 图像拼接有源码的论文全覆盖(有的自己复现),帮助你通过源码进一步理解论文算法,助你做实验,跑出拼接结果,得到评价指标RMSE、SSIM、PSNR等,并寻找潜在创新点和改进提升思路。
超分辨率重建专栏 —— 从SRCNN开始,带你读论文,写代码,复现结果,找创新点,完成论文。手把手教,保姆级攻略。帮助你顺利毕业,熟练掌握超分技术。
图像去噪专栏 —— 从DnCNN开始,100个经典的基于深度学习的图像去噪算法。读懂论文,看懂代码,复现结果,寻找创新,新手小白入门,保姆级攻略。帮助你顺利毕业,实现目标。
关注文章最底部微信公众号【十小大的底层视觉工坊】,获取最精炼版论文解读!
有需要的同学可以点上面链接看看。
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 = 6 | multi-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()