FLANNを使用して多くの画像のSIFT特徴マッチングを最適化するにはどうすればよいですか?
Python OpenCVドキュメントから取得した実用的な例があります。ただし、これは1つの画像を別の画像と比較しているため、時間がかかります。一連の画像(数千)で一致する特徴を検索するために必要です。 )そして私はそれをより速くする必要があります。
私の現在の考え:
import sys#デバッグ専用 import numpy as np import cv2 from matplotlib import pyplot as plt MIN_MATCH_COUNT = 10 img1 = cv2.imread( 'image.jpg'、0)#queryImage img2 = cv2.imread( 'target.jpg'、0)#trainImage #SIFT検出器を開始します sift = cv2.SIFT() #SIFT kp1、des1でキーポイントと記述子を見つけます= sift.detectAndCompute(img1、None) kp2、des2 = sift.detectAndCompute(img2、None) FLANN_INDEX_KDTREE = 0 index_params = dict(algorithm = FLANN_INDEX_KDTREE、trees = 5) search_params = dict(checks = 50) flann = cv2.FlannBasedMatcher(index_params、search_params) 一致= flann.knnMatch(des1、des2、k = 2) #Loweの比率テストに従ってすべての良い一致を保存します。 good = [] for一致するm、n: if m.distance MIN_MATCH_COUNT: src_pts = np.float32([kp1 [m.queryIdx] .pt for m in good])。reshape(-1,1,2) dst_pts = np.float32([kp2 [m.trainIdx] .pt for m in good])。reshape(-1,1,2 ) M、マスク= cv2.findHomography(src_pts、dst_pts、cv2.RANSAC、5.0) matchesMask = mask.ravel()。tolist() h、w = img1.shape pts = np.float32([[0,0]、[0、h-1]、[w-1、h-1]、[w -1,0]])。reshape(-1,1,2) dst = cv2.perspectiveTransform(pts、M) img2 = cv2.polylines(img2、 [np.int32(dst)]、True、255,3、cv2.LINE_AA) else: print "十分な一致が見つかりません-%d /%d" %(len(good)、MIN_MATCH_COUNT) matchesMask = None draw_params = dict(matchColor =(0,255,0)、#一致を緑色で描画 singlePointColor = None、 matchsMask = matchesMask、#インライアのみを描画 flags = 2) img3 = cv2.drawMatches(img1、kp1、img2、kp2、 good、None、** draw_params) plt.imshow(img3、 'gra y ')、plt.show()
[〜#〜]更新[〜#〜]
多くのことを試した後、私は今解決策に近づいたかもしれません。インデックスを作成して、次のように検索できることを願っています。
flann_params = dict(algorithm = 1、trees = 4) flann = cv2.flann_Index(npArray、flann_params) idx、dist = flann.knnSearch(queryDes、1、params = {})
ただし、受け入れられたnpArrayをflann_Indexパラメーターに構築することはまだできていません。
すべての画像を画像としてループします: npArray.append(sift.detectAndCompute(image、None)) npArray = np.array(npArray)
私はこれをPythonで解決したことはありませんが、環境をC++に切り替えました。この場合、OpenCVの例が増え、ドキュメントの少ないラッパーを使用する必要がなくなります。
複数のファイルでのマッチングに関する問題の例は、次の場所にあります: https://github.com/Itseez/opencv/blob/2.4/samples/cpp/matching_to_many_images.cpp
@ stanleyxu2005の返信に加えて、私は現在そのようなことをしているので、マッチング全体を行う方法についていくつかのヒントを追加したいと思います。
一般的な推奨事項は、OpenCVのステッチングプロセスを確認し、ソースコードを読むことです。スティッチングパイプラインは単純な一連のプロセスであり、単一のステップをどの程度正確に実装できるかを確認する必要があります。
これが私のアドバイスのいくつかです:
これは非常に興味深いトピックです。私の耳も開いています。