如何减少软件GUI上的openCV模板匹配的误报

问题描述

我正在尝试创建一个在游戏中使用的任务程序,例如用于执行重复性简单任务的机器人。

我要查找的某些元素(例如文本和按钮)非常相似(请参见下图)。

我什至使用遮罩来获得最佳效果,并且模板的大小与原始图片完全相同。

因此,在游戏的主屏幕上,只有一个元素必须匹配,因此我可以决定机器人必须执行的操作,但这是每个对接会的等级:

img / btnCara.png 0.960

img / btnCoroa.png 0.960

img / btnFinalizar.png 0.988

img / btnRender.png 0.875

img / btnSim.png 0.997

img / btnJogar.png 0.922

img / txtEnemyChosen.png 0.953

img / txtJogarPrimeiro.png 0.945

img / txtVocePerdeu.png 0.951

那么,如何减少误报并仅在屏幕上找到我要寻找的东西?

我正在使用的代码在这里

def SearchImage(img):
    partial_image = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    partial_image= cv2.threshold(partial_image,255,cv2.THRESH_BINARY)[1]

    # get largest contour from binary image
    contours = cv2.findContours(partial_image.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
    contours = contours[0] if len(contours) == 2 else contours[1]
    big_contour = max(contours,key=cv2.contourArea)

    # draw the contour of the piece outline as the mask
    mask = np.zeros((img.shape[0],img.shape[1],3),dtype=np.uint8)
    cv2.drawContours(mask,[big_contour],(255,255),1)
    hh,ww = mask.shape[:2]

    # extract the template from the BGR (no alpha) piece 
    template = img[:,:,0:3]
    correlation = cv2.matchTemplate(img_np,template,cv2.TM_CCORR_norMED,mask=mask)
    min_val,max_val,min_loc,max_loc = cv2.minMaxLoc(correlation)
    max_val_ncc = '{:.3f}'.format(max_val)
    #print("normalize_cross_correlation: " + max_val_ncc)
    xx = max_loc[0]
    yy = max_loc[1]
    #print(xx,yy)
        
    # draw template bounds and corner intersection in red onto img
    cv2.rectangle(screenshot,(xx,yy),(xx+ww,yy+hh),(0,1)
    
    #return xx,yy
    return max_val_ncc

这是游戏的GUI:

GUI of the game

这是我在GUI上寻找的元素的列表

enter image description here

如您所见,其中一些非常相似,就像这两个:

enter image description here

enter image description here

解决方法

看起来GUI包含一些非常相似的元素,导致openCV与其中某些元素不匹配。

使用Canny Edge Detector技术(OpenCV Documentation about it),我可以从图片中删除不需要的信息,并获得最佳效果。