最近很多人同学私聊,想要这篇文章中的源码,特意重发一下,文中代码可粘贴复制。
最近和同事聊天,聊到一个比较充满使命感的心酸的话题——在网上给小朋友抄题。。。那么问题来了,除了大家所知的QQ文字识别功能之外,还有哪些方式可以做到文字识别呢。
作为一名热心的Python小工,我想这个问题可以尝试着使用Python解决一下,看下效果。
Google一下,发现很多大的厂商(百度、阿里、腾讯等)已有相关的API开放使用,那么我们今天就以百度为例,分享下如何使用百度文字识别(OCR)服务,实现文字提取,其实三者都尝试过,感觉百度的效果最好(非评测),所以本文就以百度为例。
先简单介绍下,百度大脑AI开发平台,首先我们需要注册下开发平台用户,非常简单,手机号码注册即可。
http://ai.baidu.com/
登录后我们可以在控制台看到,开发平台提供的众多服务,其中有文字识别服务。
创建一个文字识别服务应用,如下
简单操作后,我们就可以成功创建一个服务应用,如下,其中AppID、API Key、Secret Key是我们后面调用OCR服务时需要用到的。
接下来,我们看下如何使用Python调用百度OCR服务实现文字提取。
Python实现
代码设计
图片压缩:由于OCR服务对图片大小有限制,因此在使用时若图片大小超过最大限制,要进行压缩处理。OCR调用:实现利用百度OCR服务提取单张图片文字,返回文字内容。批量处理:实现N张图片的文字提取,并且保存提取结果到文本文件中。图片压缩
<code> def photo_compression(original_image , tmp_image_path): """ 图片备份、压缩 :param original_image: 原始图片路径 :param tmp_image_path: 临时图片路径,备份路径 :return: """ from PIL import Image img = Image.open(original_image) width, height = img.size # 该数值压缩后的图片大约 200k+ while (width * height > 4000000): width = width // 2 height = height // 2 e_img = img.resize((width, height), Image.BILINEAR) save_path = path.join(tmp_image_path, os.path.basename(original_image)) e_img.save(save_path) return save_path/<code>
OCR服务调用
该函数中使用到在上一章节,提到的AppID、API Key、Secret Key信息。
在代码中,我们使用了basicGeneral(通用文字识别),每天免费使用50000次,还有basicAccurate通用文字识别(高精度版),每天免费使用500次。基本满足我们日常使用,若不够,可以再使用其他文字识别服务。
<code> def ocr(original_image): """ 使用百度OCR进行文字识别,支持jpg/jpeg/png/bmp格式 :param original_image: 待识别图片 :return: """ from aip import AipOcr filename = path.basename(original_image) APP_ID = '16572971' API_KEY = '97jmvxVbuce8B3AQtxUirQ00' SECRECT_KEY = 'dWAdA12ByPnSKzMI0MAXyvUwfDh171Cn' client = AipOcr(APP_ID, API_KEY, SECRECT_KEY) with open(original_image, 'rb') as picfile_read: img = picfile_read.read() print "正在识别图片: {0} ……".format(filename) try: # 通用文字识别,50000次/天免费 result = client.basicGeneral(img) except: # 通用文字识别(高精度版),500次/天免费 result = client.basicAccurate(img) return result /<code>
批量处理
通过传入单张图片或多张图片,调用OCR服务实现批量图片文字提取。
<code> def run_ocr( original_image, tmp_image_path, result_file_path='identify_results.txt'): """ 主函数 批量执行图片文本识别,结果存储 :param original_image: 原始图片 :param tmp_image_path: 临时图片 :param result_file_path: 识别文字存储文件 :return: """ # 判断是否存在历史识别结果,若存在则删除 if path.exists(result_file_path): os.remove(result_file_path) # 判断临时图片路径是否存在,若不存在则创建 if not path.exists(tmp_image_path): os.mkdir(tmp_image_path) # 临时文件路径列表 tmp_file_path = [] for picfile in glob.glob(original_image): tmp_file = photo_compression(picfile, tmp_image_path) tmp_file_path.append(tmp_file) # 遍历所有文件,进行ocr识别 结果存储 for picfile in tmp_file_path: result = ocr(picfile) lines = [text.get('words').encode('utf-8') + '\\n' for text in result.get('words_result')] with open(result_file_path, 'a+') as fo: fo.writelines("=" * 100 + '\\n') fo.writelines("【识别图片】: {0} \\n".format(path.basename(picfile) )) fo.writelines("【文本内容】: \\n") fo.writelines(lines) os.remove(picfile) if __name__ == "__main__": tmp_image_path = r'D:\\learn\\tmp' original_image = r"D:\\learn\\*.png" run_ocr(original_image,tmp_image_path) /<code>
效果如下
单张图片
识别结果
<code> 软件测试开发技术栈V 文章视频微头条收藏 支持反编译,阿里开源性能监控分析神器 Arthas 1.0万阅读·15评论·2019-06-17 22:30 /<code>
识别结果
<code> Arthas(阿尔萨斯)是 Alibaba开源的Java诊断性能监控分析工具,它不需要做任何的参数配置,就可以直观的获取各种维庋的性能数据。通过阅读官网的介绍,可以看到,当我们遇到以下类似问题而束手无策时, Arthas可以帮助我们解决 这个类从哪个jar包加载的?为什么会报各种类相关的 EXception? ■我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? ■遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! ■是否有一个全局视角来查看系统的运行状况? ■有什么办法可以监控到M的实时运行状态? Arthas支持JDK6+,支持 Linux/Mac∧ Winodws,采用命令行交互模式,同时提供丰富的 Tab自动补全功能,进一步方便进行问题的定位和诊断/<code>
批量处理结果