第一次发文没啥经验 很多都是借鉴若有侵权请告知 必更改 开源代码只供学习交流请勿用作其他用途!!!
get_img()#这个函数是获取rgb格式屏幕截图,可用于截图一次识别多个元素
imgclick()#主要的识别图片点击函数,只选取一个点点击,可调节xy轴偏移值(识别图片a位置点击另一b位置)默认在一定范围内随机点击(可自行调节范围)图片识别率(若发现有很多误识别请调节识别率1为百分百匹配默认0.8)
imgcheck()#检测图片返回bgr数值,可用于判断按钮按下的颜色变化
下面是代码区
pip install pyautogui
pip install python opencv
import random
import pyautogui
import time
import cv2
import numpy as np
from random import randrange
def py_nms(dets, thresh):
"""Pure Python NMS baseline."""
# x1、y1、x2、y2、以及score赋值
# (x1、y1)(x2、y2)为box的左上和右下角标
x1 = dets[:, 0]
y1 = dets[:, 1]
x2 = dets[:, 2]
y2 = dets[:, 3]
scores = dets[:, 4]
# 每一个候选框的面积
areas = (x2 - x1 + 1) * (y2 - y1 + 1)
# order是按照score降序排序的
order = scores.argsort()[::-1]
# print("order:",order)
keep = []
while order.size > 0:
i = order[0]
keep.append(i)
# 计算当前概率最大矩形框与其他矩形框的相交框的坐标,会用到numpy的broadcast机制,得到的是向量
xx1 = np.maximum(x1[i], x1[order[1:]])
yy1 = np.maximum(y1[i], y1[order[1:]])
xx2 = np.minimum(x2[i], x2[order[1:]])
yy2 = np.minimum(y2[i], y2[order[1:]])
# 计算相交框的面积,注意矩形框不相交时w或h算出来会是负数,用0代替
w = np.maximum(0.0, xx2 - xx1 + 1)
h = np.maximum(0.0, yy2 - yy1 + 1)
inter = w * h
# 计算重叠度IOU:重叠面积/(面积1+面积2-重叠面积)
ovr = inter / (areas[i] + areas[order[1:]] - inter)
# 找到重叠度不高于阈值的矩形框索引
inds = np.where(ovr <= thresh)[0]
# print("inds:",inds)
# 将order序列更新,由于前面得到的矩形框索引要比矩形框在原order序列中的索引小1,所以要把这个1加回来
order = order[inds + 1]
return keep
def template(img_gray, template_img, template_threshold):
'''
img_gray:待检测的灰度图片格式
template_img:模板小图,也是灰度化了
template_threshold:模板匹配的置信度
'''
h, w = template_img.shape[:2]
res = cv2.matchTemplate(img_gray, template_img, cv2.TM_CCOEFF_NORMED)
#start_time = time.time()
loc = np.where(res >= template_threshold) # 大于模板阈值的目标坐标
score = res[res >= template_threshold] # 大于模板阈值的目标置信度
# 将模板数据坐标进行处理成左上角、右下角的格式
xmin = np.array(loc[1])
ymin = np.array(loc[0])
xmax = xmin + w
ymax = ymin + h
xmin = xmin.reshape(-1, 1) # 变成n行1列维度
xmax = xmax.reshape(-1, 1) # 变成n行1列维度
ymax = ymax.reshape(-1, 1) # 变成n行1列维度
ymin = ymin.reshape(-1, 1) # 变成n行1列维度
score = score.reshape(-1, 1) # 变成n行1列维度
data_hlist = []
data_hlist.append(xmin)
data_hlist.append(ymin)
data_hlist.append(xmax)
data_hlist.append(ymax)
data_hlist.append(score)
data_hstack = np.hstack(data_hlist) # 将xmin、ymin、xmax、yamx、scores按照列进行拼接
thresh = 0.3 # NMS里面的IOU交互比阈值
keep_dets = py_nms(data_hstack, thresh)
#print("nms time:", time.time() - start_time) # 打印数据处理到nms运行时间
dets = data_hstack[keep_dets] # 最终的nms获得的矩形框
return dets
def get_img():
# 获取屏幕截图
pyautogui.screenshot("sc.png")
#以灰度加载图片
img_rgb = cv2.imread("sc.png")
return img_rgb
def get_imggray(img_rgb):
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
return img_gray
def imgclick(t_img,template_address,shift_x = 0,shift_y = 0,random_number = 20,template_shreshold = 0.8):
'''
img待检测图片
template_address模版图地址
shift_x横坐标偏移
shift_y纵坐标偏移0
random坐标随机数范围-random,random
template_shreshold模版识别率
'''
# 模板相似度
temp_shreshold = template_shreshold
img_template = cv2.imread(template_address, 0)
img_rgb = t_img
img_gray = get_imggray(img_rgb)
r = random.uniform(-random_number, random_number)
tim = random.uniform(0,0.1)
result = 0
try:
dets = template(img_gray, img_template, temp_shreshold)
for coord in dets:
#print((int(coord[0])+(int(coord[2])))/2,(int(coord[1])+(int(coord[3])))/2)
np.any(dets >= 0)
x = (int(coord[0]) + (int(coord[2]))) / 2
y = (int(coord[1]) + (int(coord[3]))) / 2
# X轴偏移加随机
sx = shift_x + r
# Y轴偏移加随机
sy = shift_y + r
nx = x + sx
ny = y + sy
pyautogui.moveTo(nx, ny, tim)
time.sleep(tim)
pyautogui.mouseDown(nx, ny)
time.sleep(tim)
pyautogui.mouseUp(nx, ny)
st = template_address.strip('.png').strip('/img')
print("在", (x,y), "检测到",st,"已点击", ('%.1f' % nx, '%.1f' % ny))
result = 1
#time.sleep(0.1)
#识别区画红框
#cv2.rectangle(img_rgb, (int(coord[0]), int(coord[1])), (int(coord[2]), int(coord[3])), (0, 0, 255), 2)
#随机取单次结果
break
#打开测试窗口
# cv2.imshow('img_rgb', img_rgb)
# cv2.waitKey(0)
except:
pass
return result
def imgcheck(t_img,template_address,template_shreshold = 0.8):
'''
img颜色检测
img待检测图片
template_address模版图地址
template_shreshold模版识别率
返回BGR值
'''
# 模板相似度
temp_shreshold = template_shreshold
img_template = cv2.imread(template_address, 0)
img_rgb = t_img
img_gray = get_imggray(img_rgb)
b = 0
g = 0
r = 0
try:
dets = template(img_gray, img_template, temp_shreshold)
for coord in dets:
np.any(dets >= 0)
x = int((coord[0] + coord[2]) / 2)
y = int((coord[1] + coord[3]) / 2)
st = template_address.strip('.png').strip('/img')
print("在", (x,y), "检测到",st)
b = img_rgb[y,x,0]
g = img_rgb[y,x,1]
r = img_rgb[y,x,2]
# 随机取单次结果
break
#打开测试窗口
#cv2.imshow('img_rgb', img_rgb)
#cv2.waitKey(0)
except:
pass
return b,g,r
def mouse_position():
#显示鼠标当前位置坐标
while True:
x,y = pyautogui.position() #获取当前鼠标的位置
posStr = str(x).rjust(4)+','+str(y).rjust(4)
print(posStr)
time.sleep(1)
以下为使用实例
import autotouch
import time
def siji():
while True:
t_img = autotouch.get_img()
autotouch.imgclick(t_img,'img/1.png',109,-37)
if autotouch.imgcheck(t_img,'img/2.png')[0] == 60:
autotouch.imgclick(t_img, 'img/2.png')
time.sleep(1)
autotouch.imgclick(t_img,'img/3.png', 1000, 0, 20, 0.9)
autotouch.imgclick(t_img, 'img/4.png', 560, 40)