私はOpenCVでPythonで最初のステップを進めています。
私がしたいことは、画像が与えられ、参照画像のコレクションからその「元の」画像を見つけることです。クエリーイメージはイメージ全体(カード)のシンプルな写真なので、「写真の中のオブジェクトを見つける」というシナリオではなく、単に「類似」テストです。
私の最終的なデータベースはかなり大きくなります(約25 000イメージ)が、私は小さなスケール(わずか270イメージ)でいくつかのテストをやり始めました。
認識は完全に機能しますが、かなり遅いです:270画像すべてを繰り返し処理するのに8秒かかります。ディスクリプタをディスクに保存して読み込み、計算する代わりにディスクリプタを保存することで、スピードアップすることができました。とにかくそれはまだ遅いです。画像のデータベースから画像を探す
私はFLANNで作業を始めました。いくつかの結果が得られましたが、私の主な問題は、一致する画像を見つけることです。私はポイントの全体の配列を取得しますが、私は正しいイメージを取得する方法を知らない。
これは私のコードです:私が最も類似した画像をバック参照することができる方法についての
scanned = 'tests/temp_bw.png'
surf = cv2.xfeatures2d.SURF_create(400)
surf.setUpright(True)
img1 = cv2.imread(scanned, 0)
kp1, des1 = surf.detectAndCompute(img1, None)
FLANN_INDEX_KDTREE = 1
index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
des_all = None
for filename in os.listdir('images'):
img2 = cv2.imread('images/' + filename, 0)
kp2, des2 = surf.detectAndCompute(img2, None)
if des_all is None:
des_all = des2
else:
des_all = np.concatenate((des_all, des2))
flann = cv2.flann.Index()
print "Training..."
flann.build(des_all, index_params)
print "Matching..."
indexes, matches = flann.knnSearch(des1, 10)
# and now???
任意の提案ですか?
EDIT これは、これらはflann.knnSearch
からの戻り値ですdes2
print des2.shape
(1731, 64)
(2144, 64)
(1811, 64)
(1649, 64)
の形状である:
pprint(matches[0])
array([ 0.0463759], dtype=float32)
pprint(indexes[0])
array([249106], dtype=int32)
問題は表示されません。あなたの最初のアプローチではいくつかの類似度計算が使用されており、線形検索を使用して最大値を見つけました。今、近似検索を使用すると、10人の候補が得られます。これらの10個を同じようにするだけです(おそらくインデックスを使用して比較するデータを取得できますが、それはflann - > docsに依存します)。またはちょうど最初の場所で1人の候補者を尋ねる、または... – sascha