使用PaddleOCR在Ubuntu上实现一键截屏OCR提取文本
转自:https://aistudio.baidu.com/aistudio/projectdetail/5665249
一、项目简介
1.1 简要说明
- 最近在折腾Ubuntu,有一个截屏然后OCR提取文本的应用需求。
- 在Windws上这样的工具很好找,但是在Linux没有现成的软件可用,得自己解决。
- 网上流行的方案是使用tesseract,试了一下,效果并不好,中文能给识别出一堆乱码。
- 于是想到PaddleOCR有预训练模型可以用,于是尝试了一下。
- 这里把用到的两个脚本文件ocr.py和ocr.sh一起放到了这个项目中,fork本项目后可直接下载使用。
1.2 效果对比
- 先来看看tesseract的效果:
- 上图是在放大了4倍之后用tesseract设别的,可以看到明显的错误:
- “[源代码]”给识别成了“(JAC 53)”,这就太离谱了
- 出现了一个不想要的空行(第二行)
- 出现了无法识别的内容(第四行)
- 同样的内容,再看看PaddleOCR的效果:
- 上图是在没有进行放大的情况下用PaddleOCR调默认模型识别的结果,除了把数字“0”识别成了字母“o”之外,没有其他错误,这个效果就好太多了。
二、环境准备
- 操作系统是Ubuntu22.04
- 需要使用几个软件包:
- 截屏工具(必需):sudo apt install gnome-screenshot
- 图片放大工具(可以不用):sudo apt install imagemagick
- 剪切板工具(可以不用):sudo apt install xclip
- PaddleOCR直接安装就好:pip install paddleocr
三、实现思路
- 流程设计
- Step1 快捷键触发截屏,保存图片
- Step2 调PaddleOCR识别图片中的文字,输出识别结果
- Step3 展示识别结果
- 实施方案
- Ubuntu可以自定义快捷键
- 虽然可以用python脚本来完成所有操作,但是一方面代码量太大不便于实现,另一方面python的速度不会太快,所以考虑除了推理和结果处理部分使用python,其余操作都用shell脚本来完成
- 于是需要一个python脚本,用来执行推理和结果处理
- 还需要一个shell脚本,用来截屏、调python脚本、展示处理结果
四、创建python脚本文件
- 创建一个python脚本文件,名为 ocr.py 并填充以下内容
#!/usr/bin/env python3 # copy from https://aistudio.baidu.com/aistudio/projectdetail/5665249 from paddleocr import PaddleOCR, draw_ocr import sys import getopt from PIL import Image # 执行ocr并写入txt文件 def exe_ocr(img_path,file_txt = "result.txt",img_result = "result.jpg"): # Paddleocr目前支持的多语言语种可以通过修改lang参数进行切换 # 例如`ch`, `en`, `fr`, `german`, `korean`, `japan` ocr = PaddleOCR(use_angle_cls=False, lang="ch") # need to run only once to download and load model into memory result = ocr.ocr(img_path, cls=False) res = result[0] # 因为只有一张图片,所以结果只有1个,直接取出 boxes = [] # 检测框坐标 txt = "" # 检测识别结果 for line in res: #print(line[1][0]) txt += line[1][0]+"\n" # 取出文本 boxes.append(line[0]) # 取出检测框 with open(file_txt, 'w')as f: # 以w方式打开,没有就创建,有就覆盖 f.write(txt) image = Image.open(img_path).convert('RGB') # 读取原图片 im_show = draw_ocr(image, boxes) # 画检测框 im_show = Image.fromarray(im_show) # 转换 im_show.save(img_result) # 保存 # 主函数 def main(argv): img_path = "" # 图片路径 file_txt = "result.txt" # 输出的文本文件路径 img_result = "result.jpg" # 检测结果图片路径 # 解析参数 # "hi:o:": 短格式分析串, h 后面没有冒号, 表示后面不带参数; i 和 o 后面带有冒号, 表示后面带参数 # ["help", "input_file=", "output_file="]: 长格式分析串列表, help后面没有等号, 表示后面不带参数; input_file和output_file后面带冒号, 表示后面带参数 # 返回值包括 `opts` 和 `args`, opts 是以元组为元素的列表, 每个元组的形式为: (选项, 附加参数),如: ('-i', 'test.png'); # args是个列表,其中的元素是那些不含'-'或'--'的参数 opts, args = getopt.getopt(argv[1:], "hi:o:", ["help", "input_file=", "output_file="]) for opt, arg in opts: if opt in ("-h", "--help"): print('python3 ocr.py -i <input_file.png> -o <output_file.txt>') print('or: python3 ocr.py --input_file=<input_file.png> --output_file=<output_file.txt>') sys.exit() elif opt in ("-i", "--input_file"): img_path = arg elif opt in ("-o", "--output_file"): file_txt = arg if img_path == "": #print("必须指定一个图片文件") sys.exit() img_result = file_txt[:file_txt.rindex('.')+1]+"jpg" #print('输入图片文件为:', img_path) #print('输出txt文件为: ', file_txt) #print('输出result文件为: ', img_result) exe_ocr(img_path,file_txt,img_result) if __name__ == '__main__': main(sys.argv)五、创建shell脚本文件
- 创建一个shell脚本文件,名为 ocr.sh 并填充以下内容
#!/bin/env bash # copy from https://aistudio.baidu.com/aistudio/projectdetail/5665249 # 定义一个文件基本路径,假设用户名是 pi,临时文件放在主目录下的ocrtemp下 SCR="/home/pi/ocrtemp/temp" # 获取一个截图 # 这里用到了gnome-screenshot,需要先安装好:sudo apt install gnome-screenshot gnome-screenshot -a -f ${SCR}.png # 放大图片 # 如果觉得效果不好,可以尝试把图片放大 # 需要先安装一个软件包:sudo apt install imagemagick # mogrify -modulate 100,0 -resize 400% ${SCR}.png # OCR by paddleocr python3 ocr.py -i ${SCR}.png -o ${SCR}.txt # 打开文件 # 调用系统默认程序分别打开:原始图片、检测结果、识别出来的文本 xdg-open ${SCR}.png xdg-open ${SCR}.jpg xdg-open ${SCR}.txt # 把文本复制到剪切板 # 需要先安装软件包:sudo apt install xclip # 由于ocr结果一般都会有各种问题,其实并不能直接使用 # cat ${SCR}.txt | xclip -selection clipboard # 退出 exit
六、准备目录
- 在主目录下创建临时文件夹:mkdir ocrtemp
- 把ocr.py和ocr.sh 两个文件放到主目录下
七、配置快捷键
- 在Ubuntu的系统设置里面,找到“键盘”,再找到“键盘快捷键”,然后点开“查看及自定义快捷键”
- 点开“自定义快捷键”
- 点加号新建一个快捷键
- 设置好名称和快捷键,命令指向ocr.sh
- 然后就可以使用自定义的快捷启动截屏并OCR提取文字了