2016-12-06 11 views
0

ここに私が見つけたリンクがあります How do I find an image contained within an image画像との完璧なマッチング方法は?

そして私は上記のリンクのコードを取得します。ここで

は、これは私が大きな画像で検索するが、大きな画像が小さい画像が含まれていない小さなPICである私のコード

import re 
import os 
import time 
import cv2 
from cv2 import cv 

METHOD = cv.CV_TM_SQDIFF_NORMED 

ROOTDIR = 'GeneralIMG/' 

# Load The Deck Img 
LARGE_IMAGE = cv2.imread('deck.bmp') 

for subdir, dirs, files in os.walk(ROOTDIR): 
    for myfile in files: 
     filepath = os.path.join(subdir, myfile) 

# Read the images from the file 
     # small_image = cv2.imread(myfile) 
     # small_image = cv2.imread('GeneralIMG/cfrB.bmp') 
     Ffile = subdir + myfile 
     small_image = cv2.imread(Ffile) 

     result = cv2.matchTemplate(small_image, LARGE_IMAGE, METHOD) 

# We want the minimum squared difference 
     mn,_,mnLoc,_ = cv2.minMaxLoc(result) 
     MPx,MPy = mnLoc 
     if MPx == 0 and MPy == 0: 
      print 'Match failure!' 
     else: 
      print MPx, MPy 
      print re.sub(r"B|D", "", os.path.splitext(myfile)[0]) 

# Draw the rectangle: 
# Extract the coordinates of our best match 
     MPx,MPy = mnLoc 

# Step 2: Get the size of the template. This is the same size as the match. 
     trows,tcols = small_image.shape[:2] 

# Step 3: Draw the rectangle on LARGE_IMAGE 
     cv2.rectangle(LARGE_IMAGE, (MPx,MPy),(MPx+tcols,MPy+trows),(0,0,255),2) 

# Display the original image with the rectangle around the match. 
     cv2.imshow('output',LARGE_IMAGE) 

# The image is only displayed if we call this 
     cv2.waitKey(0) 
     # time.sleep(5) 

です。私の驚いたことに、matchTemplateはまだ結果を得ています。私が手

12~07_00-03-03.bmp http://7xpvdr.com1.z0.glb.clouddn.com/12~07_00-03-03.bmp

しかし、試合結果は以下のPICのような十分に正確ではありません。 の赤い矩形が一致します。ここで

12~07_00-01-58.bmp http://7xpvdr.com1.z0.glb.clouddn.com/12~07_00-01-58.bmp

私は大きなものではまったく同じ写真を見つけたいです。含まれていない場合は、偽を返すだけで大丈夫です。私はあいまい検索をしたくないのですが、どうすればいいですか?

これは小さいIMGある

---更新---:

small img

これは、元の大きなBMP画像

large image

が画像である場合でありますアップロードされたフォーマットは変更されます。小さいimgはpngファイルで、大きい方はbmpです。

ここで、マッチテンプレートがファジー検索を使用しているかどうかは疑問です。だから私が間違った検索結果を得た理由はここで妥当と思われる。私は正確に検索を行う方法を知りたい。 THX〜

更新:

私は[matchtemplate]

のドキュメントをチェックして、私はそれが最良の一致検索ではない完璧にマッチされることを意味し、これを見つけます。

どうすれば完璧にマッチさせることができますか?

テンプレートマッチングとは何ですか? テンプレートマッチングは、テンプレート画像(パッチ)と一致する(類似する)画像の領域を見つける技術です。

+0

最終的な画像に正確なサブ画像があるとは思わない - 投稿する前にファイルをJPEG形式で保存したり、別の形式で保存している可能性があります。実際に赤色ボックス。 JPEGファイルは正確ではないことを覚えておいてください。JPEGファイルを開いて再保存するだけで、元のファイルの完全なコピーではなくなる可能性があります。あなたは大きなイメージのオリジナル**を手に入れましたか? –

+0

@ MarkSetchell結果は、サブ画像が見つかったことを示し、大きな画像の中の正確な座標が示されます。正確な検索ではなく、matchtemplateでファジー検索を使用しているのでしょうか。 – Lee

答えて

1

minMaxLocの結果にしきい値を適用しようとしましたか?

matchTemplateminMaxLocは一度も使われていないので、実際の動作はわかりませんが、私が理解しているところから、あなたが望むものが完璧に一致すれば、探している値は0 、あなたのMETHODパラメーターに依存します)。だから、他のすべての価値を捨てるならば、完璧なマッチがなければ肯定的な結果を得るべきではありません。

+0

私はmatchtemplateのドキュメントを読むと、検索はあいまい検索です。 Matchtmeplateは完全一致の代わりに最高の一致を見つけます – Lee

+0

@あなたのベストマッチの価値は何ですか?おそらく、完璧なマッチ(0または1)ではなく、その中間の値を試すことができます。それに、あなたの小さなイメージのスケールと大きなイメージの統合の比に依存するように思われるので、私はあなたが他の方法と完全に一致するかどうかを確かめることさえできません。 –

+0

Ok私は自分のコメントを編集することはできませんので、ここで追加します: 'matchTemplate'と' minMaxLoc'を組み合わせると、それがどれほどひどい場合でも結果を出力します。フィーチャトラッキングやヒストグラムを使用した逆シフトなどの別のソリューションは、より堅牢ではありますが、完璧なマッチは得られません。私は正確に一致するテンプレートが計算上高価かもしれないことを恐れている –

関連する問題