pyautogui是个挺好用的小工具,会点py就能写一些很方便的脚本。
尤其是图片查找这个功能,不需要懂视觉就可以查找指定的图片,例如在屏幕中找某个图片素材,比如我想写个记牌器,只要把扑克牌的素材弄好就可以了。
但是由于毕竟不是视觉AI,所以还是比较笨的,pyautogui.locate这个函数应该很多人都在用,今天简单谈谈可以优化的地方。
首先要指定范围,现在的电脑分辨率动不动就2k甚至4k,如果全屏查找是比较慢的,也费电脑资源,所以可以固定屏幕位置来大幅度提高查找效率,用这个函数就行了,pyautogui.screenshot(region=(left, top, width, height))
其次,这个方法是比较笨的,就是完全比对数据,差一丢丢都不可以,所以用其他的截图软件可能导致图片不一样,这也是死活都找不到图像,pyautogui.locate返回值为None的核心原因。
最好的方法就是加个参数:confidence=0.9。
网上好多帖子都不告诉你这个服了。。。我也是查了半天才发现,常弄视觉ai的都知道,这个是置信度的意思,这样以来就不用要求图像必须分毫不差了!!!
完整语句就这么写就行pyautogui.locate(target_image,screenshot,confidence=0.9)
当然这个参数也可以根据实际改 比较灵活
注意:此方法需要安装opencv 否则报错!!!
上一个近期写的小工具,仅供参考,功能是检测电脑左上角的图标,有变化就通过串口发送给单片机做电机驱动,大家灵活改。
import pyautogui
import keyboard
import time
from serial.tools import list_ports
import serial
port_list = list(list_ports.comports())
num = len(port_list)
mark=True
if num <= 0:
print("NO COM")
else:
for i in range(num):
port = list(port_list[i])
COM=port[0]
print(COM)
ser = serial.Serial(COM, 115200)
left = 0
top = 0
width = 100
height = 100
target_image = 'jd.jpg'
while True:
if keyboard.is_pressed('esc'):
break
screenshot = pyautogui.screenshot(region=(left, top, width, height))
fresh=pyautogui.screenshot(region=(55, 38, 30, 30))
#fresh.save('jd.jpg')
target_position = pyautogui.locate(target_image,screenshot,confidence=0.9)
#print(target_position)
#print(mark)
if target_position is not None:
if mark:
#center_x = target_position.left + (target_position.width / 2)
#center_y = target_position.top + (target_position.height / 2)
#print("目标图像中心坐标:", center_x, center_y)
try:
delay = round((0.1 + 0.7 * time.time() % 1), 2)
time.sleep(delay)
ser.write(b'click')
print('click')
time.sleep(0.5)
mark=False
except:
print('browse first')
else:
mark=True
print("end")