2016-08-21 2 views
-1

Ich versuche, opencv für die Suchschaltfläche auf dem Bildschirm zu verwenden. Wenn die Schaltfläche auf dem Bildschirm vorhanden ist, funktioniert opencv perfekt, aber es gibt einige! = 0 x, y zurück, auch wenn das Bild nicht existiert. Wie man es repariert?Opencv hat Bild gefunden, das nicht auf dem Bildschirm existiert

import cv2 
def buttonlocation(image): 
    im = ImageGrab.grab() 
    im.save('screenshot.png') 
    img = cv2.imread(image,0) 
    img2 = img.copy() 
    template = cv2.imread('screenshot.png',0) 
    w,h = template.shape[::-1] 
    meth = 'cv2.TM_SQDIFF' 
    img = img2.copy() 
    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 
    return x,y 
+1

A [mcve] wäre nett ... – Julien

Antwort

0

Die documentation of opencv Details zu zwei Schritten des Verfahrens Template-Matching.

  1. 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:

enter image description here

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.

  1. 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 R255*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: enter image description here

Die erste Vorlage zu finden ist: enter image description here

Die zweite Vorlage wird nicht gefunden werden: enter image description here

Das Ergebnis: enter image description here

Verwandte Themen