Python Opencv发现图像不';不存在于屏幕上

Python Opencv发现图像不';不存在于屏幕上,python,python-2.7,python-3.x,Python,Python 2.7,Python 3.x,我尝试使用opencv在屏幕上搜索按钮的位置。若按钮存在于屏幕上,opencv工作完美,但它会返回一些=0 x,y,即使图像不存在。如何修复它 import cv2 def buttonlocation(image): im = ImageGrab.grab() im.save('screenshot.png') img = cv2.imread(image,0) img2 = img.copy() template = cv2.imread('scree

我尝试使用opencv在屏幕上搜索按钮的位置。若按钮存在于屏幕上,opencv工作完美,但它会返回一些=0 x,y,即使图像不存在。如何修复它

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
有关模板匹配过程的两个步骤的详细信息

  • 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(无符号字符,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()
    
    导入cv2
    img=cv2.imread('image.jpg',eval('cv2.CV\u LOAD\u image\u COLOR'))
    template=cv2.imread('template.jpg',eval('cv2.CV\u LOAD\u IMAGE\u COLOR'))
    cv2.imshow(“图像”,img)
    #cv2.等待键(0)
    #cv2.destroyAllWindows()
    meth='cv2.TM_SQDIFF'
    方法=评估(方法)
    res=cv2.matchTemplate(img,模板,方法)
    最小值,最大值,最小位置,最大位置=cv2。最小最大位置(res)
    左上=最小位置
    x、 y=左上方
    h、 w,c=模板形状
    打印“R=”+str(最小值)
    如果最小值
    图像:

    可以找到第一个模板:

    找不到第二个模板:

    结果是:

    A就好了。。。