程序员玩生死时速打字游戏-图片文字识别_哔哩哔哩bilibili
我的这个程序是识别图片中的字符,并且用键盘自动输出出来,从而达到模拟人按键的效果,进而来完成生死时速这个打字游戏,直接放代码:
import math
import time
import pyautogui #用于鼠标监听和返回鼠标坐标
import pymouse #鼠标相关操作
import torch #用于图片文字识别
from pykeyboard.windows import PyKeyboard #键盘相关操作
from PIL import ImageGrab #用于截图操作和图片转换
import easyocr #用于图片文字识别---这个是核心
from pynput.mouse import Listener,Button #用于鼠标监听
import numpy as np#截图---输入左上,右下的坐标,截取长方形区域图形
def cutPicture(left,top,right,botton):size = (left, top, right, botton)img = ImageGrab.grab(size)return img#输入需要识别的图片,返回图片识别内容
def distinguish(pic_name):reader = easyocr.Reader(['en'],gpu=False) # gpu=False使用cpu进行处理result = reader.readtext(pic_name, batch_size=30, detail=0) # 加参数detail=0,将结果简化return result#键盘事件,输入字符
def key_functions(string):k = PyKeyboard()k.press_key(string) #下按k.release_key(string) #松开#鼠标事件 返回鼠标所在的坐标
def mouse_functions():position = pyautogui.position()return position# 监听鼠标按键
# on_click(x, y, button, pressed)是鼠标点击时回调的函数
# 四个参数x,y,button,pressed。
# x,y描述的是鼠标点击的位置
# button是鼠标的按键,值有三种Button.left(左键)、Button.right(右键)、Button.middle(中键)
# 注意鼠标button使用按下一次会有两次反馈(按下和松开)。想要使用一次可以把一个if pressed:语句放在它的外层
# pressed的值是bool类型是鼠标按键的按下时是True,松开时为False
num = 0 #点击次数计数
def on_click(x, y, button, pressed):global num # 全局变量if button == Button.left:num = num + 1times = math.ceil((num / 2)) #向上取整,判断点击次数# print('{0}位置{1}'.format('鼠标左键按下'if pressed else '鼠标左键松开',(x, y)))if times == 1 and num == 1:img = cutPicture(59, 525, 559, 548) #截图# img = cutPicture(x, y, x+500, y+50) # 截图img = np.asanyarray(img)result = distinguish(img) #识别图片文字print(result)else:img = cutPicture(328, 525, 828, 548) # 截图# img = cutPicture(x, y, x + 500, y + 50) # 截图img = np.asanyarray(img)# img.save("D://PythonProject//gameTest//SSSSgame//5.png") #保存图片result = distinguish(img) # 识别图片文字print(result)for j in range(len(result)): #循环图片文字结果for i in range(len(result[j])):time.sleep(0.05) #键盘输出文字的时间间隔,相当于调整打字的速度key_functions(result[j][i]) #键盘自动输出文字elif button == Button.middle: #按鼠标中键滑轮的退出鼠标监听return Falseif __name__ == '__main__':# time.sleep(1) # 睡眠1秒with Listener(on_click=on_click) as listener: #鼠标监听,按压左键则触发事件listener.join()
程序执行逻辑:按压鼠标左键开始触发截图,按照特定坐标进行截图后进行图片字符识别,然后返回识别结果,触发键盘事件,遍历结果并进行模拟输出。
整个程序代码量只有几十行,难点在于easyocr的安装:
1.如果没有大型的项目,仅仅是玩玩,就跑CPU模式,识别速度已经够了,这样就直接按照正常库的安装easyocr就行了
2.如果有复杂的项目,需要更快的速度,需要跑GPU模式,则需要按照显卡的版本,驱动的版本,以及对应easyocr的版本和torch的GPU版本(非CPU版)以及对应torchvision的版本进行安装。这些版本对于网上都有相关资料。最后执行代码检测:
a = torch.cuda.is_available()
如果返回True则可以跑GPU模式,否则则不能。如图:
以上就是程序整个大致过程了,感兴趣的朋友可以点击上面或者下面的链接评论,也请去视频里面点赞支持小编吧!
https://www.ixigua.com/7082572739277652517?logTag=bba780536c1499a18a56