documentation of opencvテンプレートマッチング手順の2つのステップの詳細。
R=cv2.matchTemplate(I,T,method)
は、画像R
を計算する。この画像の各画素x,y
は、テンプレートT
とI
のサブ画像x,y
から始まる部分画像との間の類似性に応じてマークを表す。方法cv.TM_SQDIFF
が適用される場合、例えば、マークのように計算される:R[x,y]
がヌルの場合
、次いでサブ画像I[x:x+sxT,y:y+syT]
テンプレートT
と全く同じです。 R[x,y]
が小さいほど、サブ画像に近いテンプレートになります。
cv2.minMaxLoc(R)
が適用され、最小値はR
です。対応するサブ画像I
は、I
の他のサブ画像よりもテンプレートに近いと予想される。
画像I
テンプレートが含まれていない場合、R
の最小値に対応するI
のサブ画像は、T
とは非常に異なっていてもよいです。しかし、最小値の価値はこれを反映しています! 実際、R
のしきい値は、テンプレートが画像内にあるかどうかを判断する方法として適用できます。
しきい値の値を選択するのは難しい作業です。これは、R
の最大値の一部またはRの平均値の一部であってもよい。R
をsxT*syT
で除算することによって、テンプレートのサイズの影響を除外することができる。たとえば、最大値はR
で、テンプレートのサイズと画像の種類によって異なります。たとえば、CV_8UC3(符号なしchar、3チャネル)の場合、R
の最大値は255*3*sxT*syT
です。ここ
は一例であり:
import cv2
img = cv2.imread('image.jpg',eval('cv2.CV_LOAD_IMAGE_COLOR'))
template = cv2.imread('template.jpg',eval('cv2.CV_LOAD_IMAGE_COLOR'))
cv2.imshow('image',img)
#cv2.waitKey(0)
#cv2.destroyAllWindows()
meth = 'cv2.TM_SQDIFF'
method = eval(meth)
res = cv2.matchTemplate(img,template,method)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
top_left = min_loc
x,y = top_left
h,w,c=template.shape
print 'R='+str(min_val)
if min_val< h*w*3*(20*20):
cv2.rectangle(img,min_loc,(min_loc[0] + w,min_loc[1] + h),(0,255,0),3)
else:
print 'first template not found'
template = cv2.imread('template2.jpg',eval('cv2.CV_LOAD_IMAGE_COLOR'))
res = cv2.matchTemplate(img,template,method)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
top_left = min_loc
x,y = top_left
h,w,c=template.shape
print 'R='+str(min_val)
if min_val< h*w*3*(20*20):
cv2.rectangle(img,min_loc,(min_loc[0] + w,min_loc[1] + h),(0,0,255),3)
else:
print 'second template not found'
cv2.imwrite("result.jpg", img);
cv2.namedWindow('res',0)
cv2.imshow('res',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
画像:
最初のテンプレートが見出される:
第二テンプレートが発見されていません。
結果:
[mcve]はいいです... – Julien