2016-08-21 3 views
-1

opencvを画面上の検索ボタンの位置に使用しようとしています。画面上にボタンが存在すれば、opencvは完璧に動作しますが、画像が存在しなくてもいくつかの!= 0 x、yを返します。それを修正するには?Opencvが画面に存在しない画像を発見しました

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

[mcve]はいいです... – Julien

答えて

0

documentation of opencvテンプレートマッチング手順の2つのステップの詳細。

  1. R=cv2.matchTemplate(I,T,method)は、画像Rを計算する。この画像の各画素x,yは、テンプレートTIのサブ画像x,yから始まる部分画像との間の類似性に応じてマークを表す。方法cv.TM_SQDIFFが適用される場合、例えば、マークのように計算される:R[x,y]がヌルの場合

enter image description here

、次いでサブ画像I[x:x+sxT,y:y+syT]テンプレートTと全く同じです。 R[x,y]が小さいほど、サブ画像に近いテンプレートになります。

  1. cv2.minMaxLoc(R)が適用され、最小値はRです。対応するサブ画像Iは、Iの他のサブ画像よりもテンプレートに近いと予想される。

画像Iテンプレートが含まれていない場合、Rの最小値に対応するIのサブ画像は、Tとは非常に異なっていてもよいです。しかし、最小値の価値はこれを反映しています! 実際、Rのしきい値は、テンプレートが画像内にあるかどうかを判断する方法として適用できます。

しきい値の値を選択するのは難しい作業です。これは、Rの最大値の一部またはRの平均値の一部であってもよい。RsxT*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() 

画像: enter image description here

最初のテンプレートが見出される: enter image description here

第二テンプレートが発見されていません。 enter image description here

結果: enter image description here

関連する問題