一、这个脚本的作用
通过鼠标拖动一个区域,每隔一秒对这个区域进行一次截图,并保存在本地。(二)
然后对本地的截图依次进行OCR,并把文字结果保存为一个文本。(三)
二、截图代码
import pyautogui
import time
from pynput import mouse
# 初始化变量
start_point = None
end_point = None
has_ran = False
var1, var2, var3, var4 = 0, 0, 0, 0
# 鼠标点击事件
def on_click(x, y, button, pressed):
global start_point, end_point, has_ran, var1, var2, var3, var4
if not has_ran and pressed:
start_point = (x, y)
elif not pressed and start_point is not None:
end_point = (x, y)
var1, var2 = map(int, start_point)
var3, var4 = map(int, (end_point[0] - start_point[0], end_point[1] - start_point[1]))
if var3 == 0 or var4 == 0:
print("Clicks are too close together or identical.")
return
has_ran = True
print(var1, var2, var3, var4)
# 停止监听器
listener.stop()
# 调用截图函数
capture_area(var1, var2, var3, var4)
# 截图函数
def capture_area(x1, y1, x2, y2):
while True:
screenshot = pyautogui.screenshot(region=(x1, y1, x2, y2))
screenshot.save(f'screenshot_{int(time.time()*1000)}.png')
time.sleep(1)
# 创建鼠标监听器
with mouse.Listener(on_click=on_click) as listener:
listener.join()
# 注意:listener.join() 会阻塞,所以 capture_area 函数会在 on_click 中调用
三、识别代码
import os
import re
from paddleocr import PaddleOCR
# 初始化 PaddleOCR
ocr = PaddleOCR(use_angle_cls=True, lang="ch") # 需要运行一次以下载并加载模型到内存
# 设置图片文件夹路径
image_folder_path = './screenshots/'
output_file = 'output1.txt'
# 获取图片文件列表并排序
def natural_sort_key(s):
# 将字符串分割成数字和非数字部分
return [int(text) if text.isdigit() else text for text in re.split('(\d+)', s)]
image_files = sorted(os.listdir(image_folder_path), key=natural_sort_key)
with open(output_file, 'w') as f:
for image_file in image_files:
# 检查文件扩展名是否为图片格式
if image_file.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.gif')):
# 构建完整的文件路径
full_image_path = os.path.join(image_folder_path, image_file)
# 执行 OCR 识别
result = ocr.ocr(full_image_path, cls=True)
# 检查 result 是否为 None
if result is None:
print(f"No result for image {image_file}")
continue
# 打印每个图片文件的识别结果
for idx in range(len(result)):
res = result[idx]
# 检查 res 是否为 None
if res is not None:
for line in res:
print(line)
else:
print(f"No result for image {image_file} part {idx}")
# 打印图片文件名和识别到的文本
if result[0] is not None:
txts = [line[1][0] for line in result[0]][0] # 最后一个[0]是为了只获取其中的文字
print(f"{image_file} 的识别结果: {txts}")
f.write(f'{txts}\n')
else:
print(f"{image_file} 没有文字")
print("-" * 50) # 打印分隔线,以便区分不同图片的结果
四、总结
它能干什么,就各取所需了。我觉得能用的地方挺多,比如抓字幕。