Die documentation of opencv Details zu zwei Schritten des Verfahrens Template-Matching.
R=cv2.matchTemplate(I,T,method)
berechnet ein Bild R
. Jedes Pixel x,y
dieses Bildes repräsentiert eine Markierung in Abhängigkeit von der Ähnlichkeit zwischen der Vorlage T
und der Teilabbildung I
ab x,y
. Zum Beispiel, wenn das Verfahren cv.TM_SQDIFF
angelegt wird, wird die Markierung berechnet als:
Wenn R[x,y]
null ist, dann wird das Unterbild I[x:x+sxT,y:y+syT]
auf die Vorlage genau identisch ist T
. Je kleiner R[x,y]
ist, desto näher an der Vorlage ist das Teilbild.
cv2.minMaxLoc(R)
wird angewendet, um das Minimum von R
zu finden. Das entsprechende Unterbild von I
wird voraussichtlich näher an der Vorlage als jedes andere Teilbild von I
erwartet.
Wenn das Bild I
nicht die Vorlage enthält, das Teilbild von I
auf das Minimum von R
entsprechen, kann von T
sehr unterschiedlich sein. Aber der Wert des Minimums spiegelt dies wider! In der Tat kann ein Schwellenwert auf R
als eine Möglichkeit angewendet werden, um zu entscheiden, ob sich die Vorlage in dem Bild befindet oder nicht.
Die Auswahl des Schwellenwerts ist eine knifflige Aufgabe. Es könnte ein Bruchteil des Maximalwerts von R
oder ein Bruchteil des Mittelwerts von R sein. Der Einfluss der Größe des Templats kann durch Dividieren von R
durch das sxT*syT
aufgehoben werden. Zum Beispiel hängt der Maximalwert von R
von der Vorlagengröße und dem Typ des Bildes ab. Zum Beispiel ist für CV_8UC3 (vorzeichenloses Zeichen, 3 Kanäle) der maximale Wert R
255*3*sxT*syT
. Hier
ein Beispiel:
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()
Das Bild:
Die erste Vorlage zu finden ist:
Die zweite Vorlage wird nicht gefunden werden:
Das Ergebnis:
A [mcve] wäre nett ... – Julien