一、背景

之前在博文中介绍在python中如何调用tesseract ocr引擎,当时主要介绍了shell模式,shell模式需要安装tesseract程序,并且效率相对略低。

今天介绍api形式的调用方式,因为博主主要是基于windows环境进行开发,所以这里的api调用主要是指dll调用(linux之类是.so调用)

二、tesseract dll下载网址

https://github.com/charlesw/tesseract 这个网址中包含了编译好的exe及dll文件,而且x86,x64两种架构都有。

(特别说明:选择x86还是x64版本dll,只依赖于你的python架构,而不是操作系统的架构,即便是在64位操作系统,假如你的python是32位版本,这里也要选用x86版本dll)。

博主使用的64位Python,所以进入  tesseract/src/lib/TesseractOcr/x64/目录,分别下载 liblept172.dll、libtesseract304.dll 两个dll。(若是你想用shell形式调用,也可以下载tesseract.exe,与之前的博文改善的地方,就是免去安装tesseract。)

三、语言包 下载网址(tessdata)

注意说明里有这一段话,You will also need to download the language data files for tesseract 3.04 from tesseract-ocr.

网址:https://github.com/tesseract-ocr/tesseract ,下载其中的tessdata目录即可,跟dll放到同一目录。

四、vc 2015++发行包下载

注意说明里这一段话:

Since tesseract and leptonica binaries are compiled with Visual Studio 2015 you'll need to ensure you have the Visual Studio 2015 Runtime installed.

意思就是,这个tesseract 的dll是使用vs 2015编译的,所以必须安装其发行包,同样分X64,X86两个版本,还是依赖于你的开发环境,不依赖于操作系统。

五、安装pyocr for python 包

用pip就可以安装: pip install pyocr,也可以到官网下载源码,手动安装: https://github.com/jflesch/pyocr

最新的pyocr是0.4.1,其源码还是基于tesseract 3.0.2 ,而前文下载的tesseract 已经是3.0.4版本了,所以需要改下pyocr源码。 (需要说明的是pyocr包,比起以前博文提的pytesseract包要更复杂一些,同时支持shell、api 、Cuneiform 三种形式。)

修改源码文件 :C:\Python27\Lib\site-packages\pyocr\libtesseract\libtesseract_raw.py文件。

如下所示: 红色字体行,把302dll改成304dll

TESSDATA_PREFIX = os.getenv('TESSDATA_PREFIX', None)

if sys.platform[:3] == "win":
libnames = [
# Jflesch> Don't they have the equivalent of LD_LIBRARY_PATH on
# Windows ?
"../vs2010/DLL_Release/libtesseract302.dll",
"libtesseract304.dll", #libtesseract302.dll
]
else:
libnames = [
"libtesseract.so.3",
]

  

六、编写测试程序

直接放源码 pyocr-test.py :

#coding=utf-8 

'''
当前目录必须有tessdata ,libtesseract304.dll ,liblept172.dll
''' import os ,sys
tessdir = os.getenv('TESSDATA_PREFIX', None)
if tessdir is None :
tessdir = os.path.split(os.path.realpath(__file__))[0]
os.environ['TESSDATA_PREFIX'] = tessdir
if tessdir not in os.environ['PATH']:
os.environ['PATH']= tessdir+';' +os.environ['PATH']
#sys.path.append(tessdir) print os.environ['PATH']
print os.environ['TESSDATA_PREFIX'] from pyocr import libtesseract
from pyocr.builders import TextBuilder
from PIL import Image filename ='1.png'
img = Image.open(filename)
#不设置成单行模式,没有输出
bu = TextBuilder(tesseract_layout=7)
#lang为语言,默认使用eng
print libtesseract.image_to_string(img,lang='fontet',builder=bu)

几个注意点:

1、前文下载的dll 与tessdata语言包文件夹,默认放到 pyocr-test.py 的同一目录下;

2、必须安装vc++ 2015 发行包(vc_redist.x86.exe 或vc_redist.x64.exe),否则会ctypes.cdll.LoadLibrary(libname)会调用dll失败。

3、源码里的第一段,主要就是用来解决python找不到dll的问题,这段代码主要功能:把当前目录加到系统PATH环境变量里,以确保dll能被搜到。

这个地方容易出问题,主要是os.path.realpath 、__file__这几个内部函数和常量,貌似在不同的开发环境,甚至不同的开发工具下都会有不同的结果,跟pyocr无关,主要是python的问题。

import os
tessdir = os.getenv('TESSDATA_PREFIX', None)
if tessdir is None :
tessdir = os.path.split(os.path.realpath(__file__))[0]
os.environ['TESSDATA_PREFIX'] = tessdir
if tessdir not in os.environ['PATH']:
os.environ['PATH']= tessdir+';' +os.environ['PATH']

4、实测时发现,bu = TextBuilder(tesseract_layout=7) 这一段不写,会导致识别出错,这个等于以前博文提到-psm 7函数,也就是单行模式。

以上

python下以api形式调用tesseract识别图片验证码的更多相关文章

  1. python 识别图片验证码报IOError

    说一下困扰了我一周的问题:识别图片验证码 本来我按照安装步骤(http://www.cnblogs.com/yeayee/p/4955506.html?utm_source=tuicool&u ...

  2. 【java+selenium3】Tesseract-OCR识别图片验证码 (十六)

    [java+selenium+Tesseract-OCR(图片识别)+AutoIt(windows窗口识别)]完成自动化图片验证码识别! 一.AutoIt(windows窗口识别)参考:https:/ ...

  3. Tesseract识别图片提取文字&字库训练

    文中测试了3.0和4.0两个版本.发现3.0识别效率不准确,需要训练词库.4.0识别效率就比较高了,而且支持结果生成pdf.txt等格式.所以推荐使用4.0版本. 这个工具可以用在爬虫的时候获取验证码 ...

  4. python爬虫20 | 小帅b教你如何使用python识别图片验证码

    当你在爬取某些网站的时候 对于你的一些频繁请求 对方会阻碍你 常见的方式就是使用验证码 验证码的主要功能 就是区分你是人还是鬼(机器人) 人 想法设法的搞一些手段来对付技术 而 技术又能对付人们的想法 ...

  5. 使用burp插件captcha-killer识别图片验证码

    0x01 开发背景 说起对存在验证码的登录表单进行爆破,大部分人都会想到PKav HTTP Fuzzer,这款工具在前些年确实给我们带来了不少便利.反观burp一直没有一个高度自定义通杀大部分图片验证 ...

  6. [Java] 识别图片验证码

    现在大多数网站都采用了验证码来防止暴力破解或恶意提交.但验证码真的就很安全吗?真的就不能被机器识别?? 我先讲讲我是怎么实现站外提交留言到一个网站的程序. 这个网站的留言版大致如下: 我一看这种简单的 ...

  7. 如何封装使用api形式调用的vue组件

    在实际开发中一般有两种封装vue组件的方法:一种就是常用的的通过props父组件传值给子组件的方法: 子组件 父组件: 还有一种就是通过调用api的形式,下面例子是本人在实际项目中封装的一个自定义图标 ...

  8. 【转】Python OCR识别图片验证码

    转载自:博客 对于某些网站登录的时候,往往需要输入验证码才能实现登录.如果要爬虫这类网站,往往总会比这个验证码导致无法爬取数据.以下介绍一种比较折中的方法,也是比较可行的方法: 实现思想: 1.通过截 ...

  9. python+selenium识别图片验证码

    import timeimport pytesseractfrom PIL import Image, ImageEnhancefrom selenium import webdriver url = ...

随机推荐

  1. Mysql的select in会自动过滤重复的数据

    默认使用 SELECT 语句: 当加上in范围后,结果如下图: in范围内的数据,如果有重复的,只会选择第一个数据. 所以如果不是直接使用SQL语句来查询,而是在代码中来查询时,记得使用 distin ...

  2. Java NIO系列教程(五) 通道之间的数据传输

    在Java NIO中,如果两个通道中有一个是FileChannel,那你可以直接将数据从一个channel(译者注:channel中文常译作通道)传输到另外一个channel. transferFro ...

  3. Python模块: 文件和目录os+shutil

    一 常用函数 os模块 os.sep 表示默认的文件路径分隔符,windows为\, linux为/os.walk(spath): 用来遍历目录下的文件和子目录os.listdir(dirname): ...

  4. Centos下安装最新版Mono并为windwos服务配置开机启动项

    一:安装Mono,此步骤参照官网 1:配置Yum仓库 #Centos 7yum install yum-utils rpm --import "http://keyserver.ubuntu ...

  5. 第七章 过滤器 Filter(二)

    一  过滤器API 由容器实现的接口 –javax.servlet.Filter –javax.servlet.FilterChain –javax.servlet.FilterConfig 四个包装 ...

  6. 【ZeroMQ】1、ZeroMQ(java)入门之Requerst/Response模式

    自己最开始是在cloud foundry中接触过消息服务器(nats),或者说是消息中间件,也算是初步知道了一个消息服务器对于分布式的网络系统的重要性,后来自己也曾想过在一些项目中使用它,尤其是在一些 ...

  7. 【14】代理模式(Proxy Pattern)

    一.引言 在软件开发过程中,有些对象有时候会由于网络或其他的障碍,以至于不能够或者不能直接访问到这些对象,如果直接访问对象给系统带来不必要的复杂性.这时候可以在客户端和目标对象之间增加一层中间层,让代 ...

  8. Hbuilder配置识别逍遥安卓模拟器

    最近在公司,需要开发一款智能家居APP,用到MUI框架,首先就是环境搭建,写好的APP页面,怎么跑在模拟器上运行? 我的开发环境: HBuilder版本:9.0.2.201803061935 逍遥安卓 ...

  9. __repr__与__str__

    首先我们来举个例子,定义一个长方行类Cuboid,长为x,宽为y,高为z class Cuboid: def __init__(self, x = 3, y = 1, z = 2): self.x = ...

  10. python网络爬虫抓取动态网页并将数据存入数据库MySQL

    简述以下的代码是使用python实现的网络爬虫,抓取动态网页 http://hb.qq.com/baoliao/ .此网页中的最新.精华下面的内容是由JavaScript动态生成的.审查网页元素与网页 ...