opencv 使用FLANN索引将图片与数据库进行匹配

i86rm4rw  于 2022-12-19  发布在  其他
关注(0)|答案(1)|浏览(139)

我想匹配一个图片与数据库,其中包含约1000张图片。我希望在收到一张图片作为输入后,该程序返回数据库中最相似的图片。

import numpy as np
import cv2
import os

scanned = 'input.jpg'
orb = cv2.ORB_create()
FLANN_INDEX_LSH = 6
flann_params = dict(algorithm = FLANN_INDEX_LSH, table_number = 10, key_size = 20, multi_probe_level = 0)
search_params = dict(checks=50)
flann = cv2.FlannBasedMatcher(flann_params,search_params)

des_all = None
for filename in os.listdir('images'):
    img2 = cv2.imread('images/' + filename, 0)
    kp2, des2 = orb.detectAndCompute(img2,None)
    flann.add([des2])
    
print ("Training...")
flann.train()                    

img1 = cv2.imread(scanned, 0)
kp1, des1 = orb.detectAndCompute(img1,None)
print ("Matching...")
matches = flann.knnMatch(des1,k=2)

在那之后,我必须做什么才能得到我的图像有最好的匹配?我如何使用匹配结果?我找不到任何有用的文档关于它谢谢你的帮助。

pgky5nke

pgky5nke1#

对于寻找最佳匹配,我有一个想法,为每个图片输入键和旧图片保存键:

matches = flann.knnMatch(kp1,kp2,k=2) 

good_matches = []
for m, n in matches:
    if m.distance < 0.7 * n.distance:
        good_matches.append(m)

然后返回每个好的匹配,最大的匹配就是你的结果当然更好的方法是使用Matlab中存在的MSER或FAST特性。使用他们的文档,他们字面上做你要求的。

相关问题