2012-03-14 26 views
6

イメージを別のイメージで見つけようとしています。OpenCV MatchTemplateの使い方は?

im = cv.LoadImage('1.png', cv.CV_LOAD_IMAGE_UNCHANGED) 
    tmp = cv.LoadImage('e1.png', cv.CV_LOAD_IMAGE_UNCHANGED) 
    w,h = cv.GetSize(im) 
    W,H = cv.GetSize(tmp) 
    width = w-W+1 
    height = h-H+1 
    result = cv.CreateImage((width, height), 32, 1) 
    cv.MatchTemplate(im, tmp, result, cv.CV_TM_SQDIFF) 
    print result 

これを実行すると、すべて正常に実行され、エラーはスローされません。しかし、私はここから何をするのか分からない。文書には、resultには「比較結果の地図」が格納されています。私はそれを印刷しようとしましたが、それは私に幅、高さ、およびステップを与えます。

この情報を使用して、1つのイメージが別のイメージに存在するかどうかを調べる方法を教えてください。

+1

OpenCVと苦労しないので、SimpleCVを試してみてください。それはOpenCVモジュールのラッパーで、使いやすくなっています:http://simplecv.org/ – Blender

答えて

7

MatchTemplateは、類似した地図であり場所ではありません。 この地図を使用して場所を見つけることができます。

あなただけの場所を得るために、このような何かを行うことができ、単一のマッチを探している場合:

minVal,maxVal,minLoc,maxLoc = cv.MinMaxLoc(result) 

その後minLocはベストマッチの場所を持っており、minValは、テンプレートがどのように適合するかうまく説明しています。この結果が一致するかどうかを判断するには、minValのしきい値を設定する必要があります。

イメージごとに複数のマッチを検索する場合は、非最大の抑圧のようなアルゴリズムを使用する必要があります。

+0

maxLocで最もよくマッチするメソッドを使用していたら、私はmaxValを見ますか? – bakalolo

4

これはあなたのために働くかもしれません! :)

def FindSubImage(im1, im2): 
    needle = cv2.imread(im1) 
    haystack = cv2.imread(im2) 

    result = cv2.matchTemplate(needle,haystack,cv2.TM_CCOEFF_NORMED) 
    y,x = np.unravel_index(result.argmax(), result.shape) 
    return x,y 

CCOEFF_NORMEDは多くの比較メソードの1つです。 参照:http://docs.opencv.org/doc/tutorials/imgproc/histograms/template_matching/template_matching.html フルリスト

これが最善の方法であるかどうかわかりませんが、速くて、うまく動作します。 :)

関連する問題