OCR技术是光学字符识别的缩写(Optical Character Recognition),是通过扫描等光学输入方式将各种票据、报刊、书籍、文稿及其它印刷品的文字转化为图像信息,再利用文字识别技术将图像信息转化为可以使用的计算机输入技术。可应用于银行票据、大量文字资料、档案卷宗、文案的录入和处理领域。(以上信息来源于百度百科OCR技术)
前几天刚好接到公司两个相关需求需求,一个是资产管理,由于信息化管理的需求,需要识别我们的物料标签;另一个是我们的会员系统,通过图片给的识别码到系统中查找是否存在相应红包、会员信息,从而避免黄牛扰乱我们的红包、会员系统,以前的做法是购买一个外部公司开发的接口(据说是1000元10万次)。基于公司的业务需求,同时也为了实践用技术解决业务上的问题的态度,把实际开发中遇到的问题记录下来,供读者们少走弯路。
一、环境准备
首先我们的操作环境是Windows操作系统(Linux系统可以通过libtesseract方式访问),我们采用的OCR识别软件是Tesseract-OCR,下载并安装Tesseract-OCR软件,安装完成之后需要配置环境变量,配置完成之后通过CMD命令行验证是否配置成功,执行tesseract -v命令查看相应版本,下面是一个CMD控制台下的识别实例。
OCR下载地址:https://digi.bib.uni-mannheim.de/tesseract/
OCR中文下载地址:https://download.csdn.net/download/qq_30273575/81897469
OCR全部语言下载地址:https://download.csdn.net/download/qq_30273575/81898150
如果用代码实现,环境变量一定要配置成C:\Program Files\Tesseract-OCR\tessdata,而不是C:\Program Files\Tesseract-OCR
配置中文语言包
默认情况下Tesseract-OCR是不能识别中文的,需要加载相应的中文语言包,简体中文语言包叫chi_sim.traineddata下载下来之后需要放置到${TESSERACT_HOME}/tessdata目录下,同时把语言包目录路径配置到环境变量当中,新增变量名称为“TESSDATA_PREFIX”。
下图中文件夹添加了英文和中文简体两种包,
语言包下载地址
至此前期的环境准备工作已经完成,读者可以通过CMD命令行的模式使用OCR的基本功能了,接下来是通过Python语言集成进来,毕竟手工操作的效率和扩展性不如程序化实现。
使用命令行转换:tesseract YINWEN.png output -l eng
环境变量要配置成C:\Program Files\Tesseract-OCR\才可以执行,与代码实现不同
YINWEN.png 为图片名,在当前文件夹下C:\Users\jeff.xie\Desktop>
output为文字输出的文件名,如下图所示,默认txt文件,
-l表示Language,这里设置的为 eng,表示为英文
下图所示,可以正常转换文本
中文转换出现乱码,待研究。。。
Python实现
安装依赖包
接下来我们主要实现Python与Tesseract-OCR交互实现程序化图片识别功能。首先我们需要安装Python 图片依赖包,本文中Python涉及到的依赖包主要有两个,一个是PIL(Python Imaging Library),另外一个就是与Tesseract-OCR交互的依赖包pytesseract,通过pip install pytesseract安装相应的包。
安装tesseract orc
下载地址:https://github.com/UB-Mannheim/tesseract/wiki
点击“tesseract-ocr-w64-setup-v4.0.0-beta.1.20180414.exe”
下载安装。注意:安装的时候选中中文包(安装时把所有选项都勾上)。本人安装目录:C:\Program Files\Tesseract-OCR\tessdata
使用命令,查看版本号和支持语言:
cd C:\Program Files\Tesseract-OCR
tesseract -v tesseract --list-langs -v tesseract --list-langs #查看Tesseract-OCR支持语言
配置tesseract运行文件
...\Lib\site-packages\pytesseract\pytesseract.py
找到文件:tesseract_cmd = 'tesseract'
修改为:tesseract_cmd = 'C:\\Program Files\\Tesseract-OCR\\tesseract.exe'
编写相应代码获取图片字符,首先是加载依赖包,读取图片,最终把从图片上读取出的字符写入一个文件保存起来,具体代码如下,两种方式实现:
from PIL import Image import pytesseract import os,sys sys.path.append(os.getcwd()) def read_text(text_path): """ 传入文本(jpg、png)的绝对路径,读取文本 :param text_path: :return: 文本内容 """ # 验证码图片转字符串 im = Image.open(text_path) # 转化为8bit的黑白图片 imgry = im.convert('L') # 二值化,采用阈值分割算法,threshold为分割点 threshold = 140 table = [] for j in range(256): if j < threshold: table.append(0) else: table.append(1) out = imgry.point(table, '1') # 识别文本 testdata_dir_config = '--tessdata-dir "C:\\Program Files\\Tesseract-OCR\\tessdata"' text = pytesseract.image_to_string(out, lang="chi_sim", config=testdata_dir_config) # text = pytesseract.image_to_string(out, lang="chi_sim") return text def read_pic(text_path): im = Image.open(text_path) text = pytesseract.image_to_string(im, lang="eng") return text if __name__ == '__main__': print(read_text("d://a2//test.png")) print(read_pic("C:/Users/jeff.xie/Desktop/YINWEN.png"))
最后的效果如下:
问题及解决:
读取中文字符的时候有异常输出,如下
Python程序不能对中文进行编码,执行程序前,需要配置中文的环境,如下:
解决pytesseract.pytesseract.TesseractError: (1, ‘Error opening data file C:\Program Files\Tesseract-OCR\tessdata/chi_sim.traineddata Please make sure the TESSDATA_PREFIX environment variable is set to your “tessdata” directory. Failed loading language ‘chi_sim’ Tesseract couldn’t load any languages! Could not initialize tesseract.’)
参考链接: https://www.pythonf.cn/read/167081
path = "img\\text-img.png"
testdata_dir_config = '--tessdata-dir "C:\\Program Files\\Tesseract-OCR\\tessdata"'
textCode = pytesseract.image_to_string(Image.open(path), config=testdata_dir_config, lang='chi_sim')
相关的学习资料: