赞
踩
随着工厂自动化要求越来越奇葩,绿箭侠对于工作环境的要求也越来越离谱。很多的操作工非常讨厌复杂的软件操作流程,为此作者将利用OCR目标检测以及键鼠自动控制库实现一键傻瓜式操作。
PIL库的ImageGrab是非常不错的截图软件,你可以通过指定xy的坐标以及框的长和宽来实现屏幕的自动化截图,便利快捷!
from PIL import ImageGrab
import numpy as np
img = ImageGrab.grab(bbox=(0, 0, 1920, 1080)) # bbox大小设定为桌面分辨率
img = np.asarray(img) # 获取图片的矩阵信息以便ocr识别
这一步主要是为了定位,截取到桌面后,接下来就可以使用百度的PaddleOCR来对图像进行推理,当然使用通用的目标检测也是同样的效果,但是需要稍微训练一下数据。由于截取的屏幕上显示的字都是微软库中自带的十分标准的字体,所以我们只需要在PaddleOCR的官网上下载现成的中英文通用的检测模型和识别模型即可。
一般OCR的识别需要两步,第一步先用目标检测将带有文字的部分小图截取出来,第二步类似于分类,使用分类模型把图片分为不同的类别,类的标签就是所要检测的字。
import os import time import numpy as np from PIL import ImageGrab from paddleocr.tools.infer import utility from paddleocr.tools.infer.predict_det import TextDetector from paddleocr.tools.infer.predict_rec import TextRecognizer import argparse det_model_path = r'C:\Users\10547\Downloads\ch_PP-OCRv3_det_infer' rec_model_path = r'C:\Users\10547\Downloads\ch_PP-OCRv3_rec_infer' rec_char_dict_path = os.path.join(os.path.dirname(utility.__file__), '../../ppocr/utils/ppocr_keys_v1.txt') time.sleep(3) img = ImageGrab.grab() # bbox大小设定为桌面分辨率 img = img.resize(mouse.screen_size()) img = np.asarray(img) arg = argparse.ArgumentParser(utility.parse_args()) arg.prog.det_model_dir = det_model_path arg.prog.rec_model_dir = rec_model_path arg.prog.rec_char_dict_path = rec_char_dict_path text_detector = TextDetector(arg.prog) text_recognizer = TextRecognizer(arg.prog) dt_boxes, _ = text_detector(img) # 文字检测/定位 img_list, index_list = [], [] for i, j, k, h in dt_boxes.astype(dtype=int): ymin = min(i[0], j[0], k[0], h[0]) ymax = max(i[0], j[0], k[0], h[0]) xmin = min(i[1], j[1], k[1], h[1]) xmax = max(i[1], j[1], k[1], h[1]) img_list.append(img[xmin:xmax, ymin:ymax]) index_list.append(((ymin + ymax) / 2, (xmin + xmax) / 2)) rec_res, _ = text_recognizer(img_list) # 文字识别/识别文字
PyUserInput库是一个非常优秀的键鼠自动化控制库,可以在不同的系统上运行,方法简单非常的容易上手!
from pymouse import PyMouse
mouse = PyMouse()
完整代码:
import os import time import numpy as np from PIL import ImageGrab, ImageFont, ImageDraw, Image from paddleocr.tools.infer import utility from paddleocr.tools.infer.predict_det import TextDetector from paddleocr.tools.infer.predict_rec import TextRecognizer import argparse from pymouse import PyMouse mouse = PyMouse() det_model_path = r'C:\Users\10547\Downloads\ch_PP-OCRv3_det_infer' rec_model_path = r'C:\Users\10547\Downloads\ch_PP-OCRv3_rec_infer' rec_char_dict_path = os.path.join(os.path.dirname(utility.__file__), '../../ppocr/utils/ppocr_keys_v1.txt') time.sleep(3) img = ImageGrab.grab() # bbox大小为桌面分辨率 img = img.resize(mouse.screen_size()) img = np.asarray(img) arg = argparse.ArgumentParser(utility.parse_args()) arg.prog.det_model_dir = det_model_path arg.prog.rec_model_dir = rec_model_path arg.prog.rec_char_dict_path = rec_char_dict_path text_detector = TextDetector(arg.prog) text_recognizer = TextRecognizer(arg.prog) dt_boxes, _ = text_detector(img) img_list, index_list = [], [] for i, j, k, h in dt_boxes.astype(dtype=int): ymin = min(i[0], j[0], k[0], h[0]) ymax = max(i[0], j[0], k[0], h[0]) xmin = min(i[1], j[1], k[1], h[1]) xmax = max(i[1], j[1], k[1], h[1]) img_list.append(img[xmin:xmax, ymin:ymax]) index_list.append(((ymin + ymax) / 2, (xmin + xmax) / 2)) rec_res, _ = text_recognizer(img_list) src_im = Image.fromarray(utility.draw_text_det_res(dt_boxes, img)) draw = ImageDraw.Draw(src_im) font_path = r'C:\Windows\Fonts\微软雅黑\msyhl.ttc' font = ImageFont.truetype(font_path, 30) for i, j in zip(rec_res, index_list): if i[0] == '微信': mouse.press(int(j[0]), int(j[1])) time.sleep(2) mouse.move(int(j[0]) + 200, int(j[0])) time.sleep(2) mouse.release(int(j[0]), int(j[0])) # draw.text(j, i[0], font=font, fill='red') # src_im.show()
2023-06-28-17-48-14
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。