1.概述
一般游戏是使用SurfaceView,所有的东西都是自己绘制,所以很难定位控件。常规的游戏测试方案,是用一个通用的测试框架配合计算机视觉。而平时在对游戏做自动化测试时,最常使用的就是利用opencv进行图像匹配,获取匹配到的图像中心点坐标,然后通过adb命令去点击该坐标。
2.Demo
先对手机截屏,然后进行图像匹配,计算匹配到的图像中心点坐标。
# 载入图像
target_img = cv2.imread("screencap.png")
find_img = cv2.imread("images/btn_close_full.png")
find_height, find_width, find_channel = find_img.shape[::]
# 模板匹配
result = cv2.matchTemplate(target_img, find_img, cv2.TM_CCOEFF_NORMED)
min_val,max_val,min_loc,max_loc = cv2.minMaxLoc(result)
# 计算位置
pointUpLeft = max_loc
pointLowRight = (max_loc[0]+find_width, max_loc[1]+find_height)
pointCentre = (max_loc[0]+(find_width/2), max_loc[1]+(find_height/2))
3.matchTemplate
关于参数 method:
CV_TM_SQDIFF 平方差匹配法:该方法采用平方差来进行匹配;最好的匹配值为0;匹配越差,匹配值越大。
CV_TM_CCORR 相关匹配法:该方法采用乘法操作;数值越大表明匹配程度越好。
CV_TM_CCOEFF 相关系数匹配法:1表示完美的匹配;-1表示最差的匹配。
CV_TM_SQDIFF_NORMED 归一化平方差匹配法
CV_TM_CCORR_NORMED 归一化相关匹配法
CV_TM_CCOEFF_NORMED 归一化相关系数匹配法
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread("orginal.jpg",0)#以灰度模式读入图像
img2 = img.copy()
template = cv2.imread("part.PNG",0)#以灰度模式读入图像
w, h = template.shape[::-1]
# 6 中匹配效果对比算法
methods = ['cv2.TM_CCOEFF', 'cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCORR',
'cv2.TM_CCORR_NORMED', 'cv2.TM_SQDIFF', 'cv2.TM_SQDIFF_NORMED']
for meth in methods:
img = img2.copy()
method = eval(meth)
res = cv2.matchTemplate(img, template, method)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
if method in [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]:
top_left = min_loc
else:
top_left = max_loc
bottom_right = (top_left[0] + w, top_left[1] + h)
#cv2.rectangle(img, top_left, bottom_right, (255,255,255), 2)
print meth
cv2.rectangle(img, top_left, bottom_right, (0, 255, 0), 2)
# cv2.imwrite('res.png',img_rgb)
cv2.imshow('res', img)
cv2.waitKey(0)
cv2.destroyAllWindows()