logo

Python自动化截图与OCR文字识别:从屏幕捕获到文本保存的全流程实现

作者:有好多问题2025.10.11 19:25浏览量:61

简介:本文详细介绍如何使用Python实现屏幕截图,调用OCR接口识别文字内容,并将结果保存为文本文件。涵盖Pillow截图、PaddleOCR/Tesseract OCR调用及文件操作,提供完整代码示例与优化建议。

Python自动化截图与OCR文字识别:从屏幕捕获到文本保存的全流程实现

一、技术背景与需求分析

在数字化转型背景下,企业常需处理大量纸质文档或屏幕显示的非结构化文本数据。传统手动录入方式效率低下且易出错,而自动化截图与OCR(光学字符识别)技术的结合,可实现从屏幕图像到可编辑文本的高效转换。本文将详细介绍如何使用Python完成以下核心功能:

  1. 屏幕区域截图或全屏截图
  2. 调用OCR接口识别图像中的文字
  3. 将识别结果保存为TXT/JSON等格式文件

该方案适用于发票信息提取、网页内容存档、代码片段识别等场景,尤其适合需要批量处理屏幕显示文本的办公自动化场景。

二、技术选型与工具准备

2.1 截图工具选择

Python中实现截图主要有以下方案:

  • Pillow库:轻量级图像处理库,支持全屏/区域截图
  • PyAutoGUI:跨平台GUI自动化工具,包含截图功能
  • mss库:高性能截图工具,支持多显示器

推荐使用Pillow(PIL)库,其安装简单且兼容性好:

  1. pip install pillow

2.2 OCR引擎对比

主流OCR方案对比:
| 方案 | 准确率 | 响应速度 | 部署复杂度 | 适用场景 |
|——————|————|—————|——————|————————————|
| Tesseract | 中 | 快 | 低 | 英文/简单中文识别 |
| PaddleOCR | 高 | 中 | 中 | 中英文混合/复杂排版 |
| 百度OCR API| 极高 | 慢 | 高 | 企业级高精度需求 |

本文以PaddleOCR为例(需安装):

  1. pip install paddleocr paddlepaddle

三、完整实现流程

3.1 屏幕截图实现

  1. from PIL import ImageGrab
  2. import time
  3. def capture_screen(save_path="screenshot.png", bbox=None):
  4. """
  5. 执行屏幕截图
  6. :param save_path: 保存路径
  7. :param bbox: 截图区域 (x1,y1,x2,y2),None表示全屏
  8. """
  9. try:
  10. # 添加1秒延迟避免截图时遮挡
  11. time.sleep(1)
  12. if bbox:
  13. img = ImageGrab.grab(bbox=bbox)
  14. else:
  15. img = ImageGrab.grab()
  16. img.save(save_path)
  17. print(f"截图已保存至: {save_path}")
  18. return save_path
  19. except Exception as e:
  20. print(f"截图失败: {str(e)}")
  21. return None

3.2 OCR文字识别实现

使用PaddleOCR进行中英文混合识别:

  1. from paddleocr import PaddleOCR
  2. def ocr_recognition(image_path, lang="ch"):
  3. """
  4. 调用PaddleOCR识别图像文字
  5. :param image_path: 图像路径
  6. :param lang: 识别语言 ('ch'中文, 'en'英文)
  7. :return: 识别结果列表 [(坐标, (文字, 置信度)), ...]
  8. """
  9. try:
  10. ocr = PaddleOCR(use_angle_cls=True, lang=lang)
  11. result = ocr.ocr(image_path, cls=True)
  12. # 提取识别文本
  13. text_results = []
  14. for line in result:
  15. for word_info in line:
  16. text = word_info[1][0]
  17. confidence = word_info[1][1]
  18. text_results.append((text, confidence))
  19. print(f"识别完成,共提取{len(text_results)}段文字")
  20. return text_results
  21. except Exception as e:
  22. print(f"OCR识别失败: {str(e)}")
  23. return []

3.3 结果保存实现

将识别结果保存为结构化文件:

  1. import json
  2. from datetime import datetime
  3. def save_results(results, output_dir="output"):
  4. """
  5. 保存识别结果
  6. :param results: 识别结果列表
  7. :param output_dir: 输出目录
  8. """
  9. try:
  10. import os
  11. if not os.path.exists(output_dir):
  12. os.makedirs(output_dir)
  13. # 生成带时间戳的文件名
  14. timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
  15. txt_path = os.path.join(output_dir, f"ocr_result_{timestamp}.txt")
  16. json_path = os.path.join(output_dir, f"ocr_result_{timestamp}.json")
  17. # 保存为TXT文件
  18. with open(txt_path, 'w', encoding='utf-8') as f:
  19. for text, conf in results:
  20. f.write(f"{text}\n")
  21. # 保存为JSON文件(含置信度)
  22. json_data = [{"text": text, "confidence": float(conf)} for text, conf in results]
  23. with open(json_path, 'w', encoding='utf-8') as f:
  24. json.dump(json_data, f, ensure_ascii=False, indent=2)
  25. print(f"结果已保存至:\n{txt_path}\n{json_path}")
  26. except Exception as e:
  27. print(f"保存结果失败: {str(e)}")

3.4 完整流程整合

  1. def main():
  2. # 1. 执行截图(示例:截取左上角(100,100)到右下角(500,500)的区域)
  3. screenshot_path = capture_screen(bbox=(100, 100, 500, 500))
  4. if not screenshot_path:
  5. return
  6. # 2. 调用OCR识别
  7. ocr_results = ocr_recognition(screenshot_path)
  8. if not ocr_results:
  9. return
  10. # 3. 保存结果
  11. save_results(ocr_results)
  12. if __name__ == "__main__":
  13. main()

四、性能优化与实用建议

4.1 识别准确率提升技巧

  1. 图像预处理

    • 使用OpenCV进行二值化处理:
      1. import cv2
      2. def preprocess_image(image_path):
      3. img = cv2.imread(image_path)
      4. gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
      5. _, binary = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY)
      6. cv2.imwrite("preprocessed.png", binary)
      7. return "preprocessed.png"
  2. 语言模型选择

    • 中英文混合内容使用lang="ch"
    • 纯英文内容使用lang="en"可提升速度
  3. 区域聚焦识别

    • 对固定布局的文档,可先定位关键区域再识别

4.2 批量处理实现

  1. import os
  2. def batch_process(image_dir, output_dir):
  3. """
  4. 批量处理目录下的所有图片
  5. """
  6. for filename in os.listdir(image_dir):
  7. if filename.lower().endswith(('.png', '.jpg', '.jpeg')):
  8. img_path = os.path.join(image_dir, filename)
  9. results = ocr_recognition(img_path)
  10. save_results(results, output_dir)

4.3 异常处理增强

添加重试机制和日志记录:

  1. import logging
  2. from tenacity import retry, stop_after_attempt, wait_exponential
  3. logging.basicConfig(filename='ocr.log', level=logging.INFO)
  4. @retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=4, max=10))
  5. def robust_ocr(image_path):
  6. try:
  7. return ocr_recognition(image_path)
  8. except Exception as e:
  9. logging.error(f"OCR尝试失败: {str(e)}")
  10. raise

五、部署与扩展方案

5.1 打包为可执行文件

使用PyInstaller打包为独立程序:

  1. pip install pyinstaller
  2. pyinstaller --onefile --windowed ocr_script.py

5.2 定时任务集成

在Linux系统下设置cron定时任务:

  1. # 每天10点执行截图OCR
  2. 0 10 * * * /usr/bin/python3 /path/to/ocr_script.py

5.3 云服务扩展

对于大规模处理需求,可考虑:

  1. 使用AWS Lambda/GCP Functions实现无服务器架构
  2. 部署PaddleOCR服务化接口
  3. 结合S3存储实现图片上传-识别-结果返回的完整流程

六、常见问题解决方案

  1. 截图空白问题

    • 检查是否在截图前隐藏了弹窗
    • 尝试使用PyAutoGUI.screenshot()替代
  2. 中文识别率低

    • 确保使用lang="ch"参数
    • 下载中文模型包:paddleocr --image_dir ./ --use_gpu false --lang ch
  3. 性能瓶颈优化

    • 对大图进行分块处理
    • 使用GPU加速(需安装GPU版PaddlePaddle)

七、总结与展望

本文实现的Python自动化方案,通过组合Pillow截图和PaddleOCR识别技术,构建了完整的屏幕文本提取流程。实际应用中可根据需求调整:

  • 添加GUI界面(如使用PyQt)
  • 集成到RPA流程中
  • 开发浏览器插件实现网页内容识别

未来随着多模态大模型的发展,OCR技术将向更高精度、更广语言支持的方向演进。建议开发者关注PaddleOCR等开源项目的更新,及时引入新技术提升识别效果。

完整代码与示例文件已上传至GitHub仓库:[示例链接],欢迎交流优化建议。

相关文章推荐

发表评论

活动