4

pythonとopencvを使用して比較したい2つの画像があります。

この本の単一の画像からサーフ機能を抽出する方法を理解しました:Pythonを使用したコンピュータービジョンのプログラミング。

次のように特徴を抽出します。

import cv2
from numpy import *

# read image
im = cv2.imread('empire.jpg')

# downsample
im_lowres = cv2.pyrDown(im)

# convert to grayscale
gray = cv2.cvtColor(im_lowres,cv2.COLOR_RGB2GRAY)

# detect feature points
s = cv2.SURF()
mask = uint8(ones(gray.shape))

keypoints = s.detect(gray,mask)

# show image and points
vis = cv2.cvtColor(gray,cv2.COLOR_GRAY2BGR)
for k in keypoints[::10]:
    cv2.circle(vis,(int(k.pt[0]),int(k.pt[1])),2,(0,255,0),-1)
    cv2.circle(vis,(int(k.pt[0]),int(k.pt[1])),int(k.size),(0,255,0),2)

cv2.imshow('local descriptors',vis)
cv2.waitKey()

を使用して、キーポイントを参照画像から取得した別のキーポイントのセットと比較するにはどうすればよいですか?

4

2 に答える 2

6

Python OpenCV の FLANN 実装があり、私はそれを自分で使用しましたが、非常にうまく機能します。最初は理解するのが簡単ではありませんでしたが、この質問は私を大いに助けてくれました.Esteban Angeeの答えを見てください.

この質問に対する私の回答もご覧ください。ここで、コードを簡単に説明しました。ここで説明を繰り返します。

r_threshold = 0.6
FLANN_INDEX_KDTREE = 1  # bug: flann enums are missing

パラメータ ディクショナリを作成します。

flann_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 4)
flann = cv2.flann_Index(desc2, flann_params)

最近隣検索を実行します。

idx2, dist = flann.knnSearch(desc1, 2, params = {}) # bug: need to provide empty dict
mask = dist[:,0] / dist[:,1] < r_threshold
idx1 = np.arange(len(desc1))
pairs = np.int32( zip(idx1, idx2[:,0]) )

一致した記述子を返します。

return pairs[mask]
于 2012-09-29T13:32:58.557 に答える
1

通常、SURF 記述子の照合は、k 最近傍 (k=2) を使用して行われます。確かに C++ の場合、OpenCV にはこれを行うための組み込みクラスがあります。高速近似最近傍記述子マッチャー ( FLANN_matcher ) ですが、これの Python バージョンのドキュメントが見つからないようです。探してみて、見つけられるかどうか見てみましょう。

これを最初から行う必要がある場合は、この投稿に を使用した優れたコード サンプルがcv2.KNearestあります。これは間違いなく Python バージョンにあります。

于 2012-09-27T13:48:21.660 に答える