Loading... 记这一次踩坑专题记录。 最近在自己研究学习 python 的 tesserocr 识别库,据大牛说这个神奇的工具可以进行验证码的识别,于是我来亲自试一下。 其中,tesserocr 这个库是 tesseract 这个软件的一个 python 封装,所以要在 python 中使用它,首先需要安装 tesseract 这个软件。 * **tesseract 下载地址:**[**http://digi.bib.uni-mannheim.de/tesseract**](http://digi.bib.uni-mannheim.de/tesseract) * **tesseract GitHub:**[**https://github.com/tesseract-ocr/tesseract**](https://github.com/tesseract-ocr/tesseract) * **tesseract 语言包:**[**https://github.com/tesseract-ocr/tessdata**](https://github.com/tesseract-ocr/tessdata) * **tesseract 文档:**[**https://github.com/tesseract-ocr/tesseract/wiki/Documentation**](https://github.com/tesseract-ocr/tesseract/wiki/Documentation) 在 Windows 下,首先需要下载 tesseract,它为 tesserocr 提供了支持。进入下载页面,可以看到有各种 `.exe` 文件的下载列表,注意,太高版本的 tesseract,可能 tesserocr 库的最新版本还不能支持,你可以安装不那么高的版本的。其中文件名中带有 dev 的为开发版本,不带 dev 的为稳定版本,可以选择下载不带 dev 的版本。 这里我选择了 `tesseract-ocr-setup-3.05.01.exe`。 ![1-23-e1588601807968.jpg](http://static.fox-9.com/uploads/2021/08/19/1-23-e1588601807968.jpg!webp) 下载完成后安装时,我们可以选择安装额外的语言包,此时可以勾选 `Additional language data (download)` 选项来安装 OCR 识别支持的语言包,这样 OCR 便可以识别多国语言。 ![1-24-e1588601850723.jpg](http://static.fox-9.com/uploads/2021/08/19/1-24-e1588601850723.jpg!webp) 但是特别需要注意的这里有个坑,就是这些语言包都是 download 下载安装的,不知道他连接到哪里下载,但亲测如果你电脑不能科学上网(懂的人都懂,不懂可以来问我)的话,到安装的时候一般会报错的。所以我首先使用科学上网,然后选择我想要的包来安装。 这里我怕有问题,将包安装在了没有任何中文的路径下,你也可以考虑下这个。 有些同学问,我没办法科学上网怎么办呢? 也有办法的,你可以手动到 Github 上面下载。 官方叫作 tessdata,其下载链接为: [https://github.com/tesseract-ocr/tessdata](https://github.com/tesseract-ocr/tessdata) 下载完成后,将所有内容放在 tessdata 文件夹中,复制进你的 tesseract 的安装目录即可。 **安装完成后,还需要将你的 tesseract 的安装目录,添加到系统环境变量中,这一步是方便后续的程序调用它,不然命令行中会找不到 tesseract 程序。(亲测)** 好了,这个装好了,总该装 tesserocr 了吧。 官方给出的安装方式当然是使用 pip 安装,在 cmd 中的命令行为: ```bash pip install tesserocr pillow ``` 其意思为将 tesserocr 和 pillow 包一起安装。从这里开始,咱们就开始了各种崩溃之旅。 经过各种测试,咱们主要的问题就是出现在 tesserocr 的包的安装上,所以你可以先使用 `pip install pillow` 这个命令来先安装 pillow 包。 然后再使用 `pip install tesserocr` 安装。 我的 python 版本目前使用的是 3.8.1,是目前看来比较新的版本(当然大家以后再看这篇文章的时候可能这个问题就解决搞定了),所以有些支持不太够。 接下来,下载 tesserocr 的包 2.5.0 倒是没什么,但是自动运行 `setup.py` 的时候就报错了。 我去网上找点别人的报错代码过来(别人装的时候可能是 2.4.0 版): ```bash E:\Python>pip install tesserocr pillow Collecting tesserocr Using cached https://files.pythonhosted.org/packages/92/2d/05a7f8387e93c192919b508e4f4936f232bd3d2ca388b9130ae538a9f9ad/tesserocr-2.4.0.tar.gz Collecting pillow Using cached https://files.pythonhosted.org/packages/19/05/e7869088bcd791fe63f6d671577d25c4e3d1fecdc21501254621c65cd74b/Pillow-5.4.1-cp36-cp36 m-win32.whl Installing collected packages: tesserocr, pillow Running setup.py install for tesserocr ... error Complete output from command e:\python\python.exe -u -c "import setuptools, tokenize;__file__='C:\\Users\\admin\\AppData\\Local\\Temp\\pip-i nstall-9vats9x_\\tesserocr\\setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(cod e, __file__, 'exec'))" install --record C:\Users\admin\AppData\Local\Temp\pip-record-t_hk__pf\install-record.txt --single-version-externally-man aged --compile: Failed to extract tesseract version from executable: [WinError 2] 系统找不到指定的文件。 Supporting tesseract v3.04.00 Building with configs: {'libraries': ['tesseract', 'lept'], 'cython_compile_time_env': {'TESSERACT_VERSION': 50593792}} running install running build running build_ext building 'tesserocr' extension error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": https://visualstudio.microsoft.com/downloads/ ---------------------------------------- Command "e:\python\python.exe -u -c "import setuptools, tokenize;__file__='C:\\Users\\admin\\AppData\\Local\\Temp\\pip-install-9vats9x_\\tessero cr\\setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" i nstall --record C:\Users\admin\AppData\Local\Temp\pip-record-t_hk__pf\install-record.txt --single-version-externally-managed --compile" failed w ith error code 1 in C:\Users\admin\AppData\Local\Temp\pip-install-9vats9x_\tesserocr\ ``` 其中有几个问题需要注意的。 **问题一:** `Failed to extract tesseract version from executable: [WinError 2] 系统找不到指定的文件`。 这个问题是第一个问题,我解决了很久,明明我正确安装了 tesseract 而且添加到了系统环境变量,为啥找不到 tesseract 呢? 最终原因:添加变量和安装后未重启,用 cmd 的普通用户模式找不到。 解决办法:打开 cmd 时使用管理员模式打开,这个报错就不会报错了。 **问题二:** ```bash building 'tesserocr' extension error: Microsoft Visual C++ 14.0 is required. Get it with “Microsoft Visual C++ Build Tools”: https://visualstudio.microsoft.com/downloads/ ``` 从这里可以分析出,这不是一个 python 的 whl 包(whl 包是啥?就是后来出的一个新标准,将包生成 whl 文件之后,即 wheel 文件,我没记错的话这个单词的意思是轮子。python 在安装包的时候直接就可以安装这个包,不用使用源码来编译成包再安装,大概是这么个意思。使用 whl 安装包就可以摆脱使用 setup.py 来安装),所以需要先编译,但是系统有缺少 Microsoft Visual C++ 14.0 编译器。应该是这个意思。 这个报错提醒我们,需要到微软的网站下载安装 Microsoft Visual C++ Build Tools 来编译。 这时候问题就来了,随着时代的发展,我打开这个页面已经很难找到这个 Microsoft Visual C++ Build Tools 了,这时候网站拼命让我下载 Visual Studio2019,这是一个微软出的 IDE 工具好像,可以进行各种编程开发,但我只需要编译一下 python 包呀,这些都不需要呀。呜呜呜。而且这些东西大小都好大,动辄几个 G,我为了编译几十 k 的 python 包,给我电脑装那么多,真的不想这样。 但是老失败呀,我就兜兜转转从别的网站别人的经验中找到了一个还不错的下载地址,可以看下我这篇文章:<div class="preview"> <div class="post-inser post box-shadow-wrap-normal"> <a href="http://fox-9.com/677.html" target="_blank" class="post_inser_a no-external-link no-underline-link"> <div class="inner-image bg" style="background-image: url(http://fox-9.com/usr/themes/handsome/assets/img/sj/1.jpg);background-size: cover;"></div> <div class="inner-content" > <p class="inser-title">visual c++ build tools 的安装与使用,装没有 whl 的 python 包时的编译工具,提示 Microsoft Visual C++ 14.0 is required</p> <div class="inster-summary text-muted"> 开发环境:win10 + Microsoft Visual C++ Build Tools 2015The Mic... </div> </div> </a> <!-- .inner-content #####--> </div> <!-- .post-inser ####--> </div> 下载后,光是初始化这个安装包配置都花了好一会儿,好了之后,果断我选择自定义配置。 这里面有好几个选项。 ![tesserocr-3.jpg](http://static.fox-9.com/uploads/2021/08/19/tesserocr-3.jpg!webp) 我第一遍是啥多余的 SDK 都不选直接安装。即使这样,你都看得到所用的空间占用有多吓人。 装完之后,输入 `pip install tesserocr` 进行 tesserocr 的编译(下同),报错,这次好像是报的缺少某些东西。 我想可能是我 SDK 没安装吧,第二次,补充勾选了 win10 的 SDK 那个。还是报错找不到某些东西。 第三次,补充勾选了 `ATL/MFC SDK` 和 `.NET` 的 SDK。这次报错跟上一次不同,但是还是有些东西找不到,至此,这个工具已经给 C 盘装了六七个 G 的东西了,还是不能解决问题。 也把我搞到了半夜快两点,决定放弃。 --- 第二天,决定选择更快捷的方式,使用 whl 包来安装。你说我之前知不知道可以用 whl 包?知道的。但是官方发布的 whl 包,暂时还不能支持 3.8 的 python,最高只能支持 3.7,所以我一直没选择它。 而我不想系统里装那么多的 python 版本,版本切换起来比较不方便。但我知道比如 Anaconda 这种工具是可以使用 python 的虚拟环境的,不影响系统本身安装的版本。 于是我考虑采用 Anaconda+whl 的方式来安装。 首先先下载安装 Anaconda: [https://www.anaconda.com/distribution/](https://www.anaconda.com/distribution/) 安装时,是否将 anaconda 等加入环境变量配置那个界面的两个勾我均没有勾选。 安装后,打开 Anaconda Navigater,进入 Environments。 ![tesserocr-4.jpg](http://static.fox-9.com/uploads/2021/08/19/tesserocr-4.jpg!webp) 默认一开始是只有 base 版本的 python 的(这个 base 版本不是你系统安装的 python,而是 anaconda 的默认版本)。我为了弄一个纯净的环境,点击 Create,创建了一个专门的版本,版本选择 3.7。 创建好之后,可以用 navigator 进入这个虚拟环境的命令行。 你也可以直接通过 cmd 进入虚拟环境的命令行。因为我一开始在安装 anaconda 的时候没有将它放到环境变量,这时候无法直接在 cmd 中使用,你可以找到 anaconda 安装目录下的 condabin 目录,将这个目录所在的路径添加到系统环境变量中,然后用管理员模式打开 cmd。 输入命令 `conda env list` 即可看到目前的 conda 有哪些虚拟环境等等。 ```bash # conda environments: # base * E:\ProgramFiles\Anaconda python3.7_for_tesserocr E:\ProgramFiles\Anaconda\envs\python3.7_for_tesserocr ``` 可以看到,目前我们激活的虚拟环境是 base 环境,你需要切换到你想用的虚拟环境中。 输入命令 `activate 虚拟环境名` 即可切换过去,使用的 pip 也会切换。比如我输入 `activate python3.7_for_tesserocr` 即可。 更多 conda 的命令行帮助请参考这篇文章:<div class="preview"> <div class="post-inser post box-shadow-wrap-normal"> <a href="http://fox-9.com/679.html" target="_blank" class="post_inser_a no-external-link no-underline-link"> <div class="inner-image bg" style="background-image: url(http://fox-9.com/usr/themes/handsome/assets/img/sj/1.jpg);background-size: cover;"></div> <div class="inner-content" > <p class="inser-title">Anaconda - 用 conda 创建 python 虚拟环境(一些 anaconda 的实用命令)</p> <div class="inster-summary text-muted"> conda 可以理解为一个工具,也是一个可执行命令,其核心功能是包管理和环境管理。包管理与 pip 的使用方法类似... </div> </div> </a> <!-- .inner-content #####--> </div> <!-- .post-inser ####--> </div> 切换后,先安装 pillow,`pip install pillow`。这步没有问题。 然后去下载 wheel 文件安装 tesserocr。 可以到这里下载:[https://github.com/simonflueckiger/tesserocr-windows_build/releases](https://github.com/simonflueckiger/tesserocr-windows_build/releases) 这里我下载了 * [tesserocr v2.4.0 - Python 3.7 - 64bit](https://github.com/simonflueckiger/tesserocr-windows_build/releases/download/tesserocr-v2.4.0-tesseract-4.0.0/tesserocr-2.4.0-cp37-cp37m-win_amd64.whl) 这个版本到我电脑上。然后进行本地安装。 输入命令:`pip install "你的whl文件的完整路径"` 比如我:`pip install "E:\tesserocr-2.4.0-cp37-cp37m-win_amd64.whl"` 然后,就安装成功了!!!(终于成功了,太难了我) --- 接下来还是抑制不住内心的喜悦,来测试了一下代码,结果又遇到一些问题: 首先打开 cmd,使用前文所说的命令切换到我们安装好 tesserocr 库的虚拟环境。 然后进入到我存着验证码的文件夹。 在此文件夹编写相关代码: ```python import tesserocr from PIL import Image imagelist = ["code.jpg", "code2.jpg", "code3.jpg", "code4.jpg"] for i in imagelist: image = Image.open(i) image = image.convert('L') threshold = 127 table = [] for i in range(256): if i < threshold: table.append(0) else: table.append(1) image = image.point(table, '1') # 用图片查看工具打开查看处理到目前到为止的图片的样子 # image.show() result = tesserocr.image_to_text(image) print(result) ``` 如上面的代码所示,我们首先导入 tesserocr 包,然后导入 Image 命令用来打开图片。 然后对图片进行循环 ocr 识别。图片打开后,convert 命令传入 L 可以进行图片灰度处理。而如果传入 1 可以进行二值化处理。不过我们需要设定二值化的阈值(这个涉及图像处理学的东西了,听听就好),我这里大概设置为 127,下面的办法就是,灰度处理之后,设置一个图形点阵,如果小于设定的阈值 threshold 的话,就设置为 0,你可以理解为白色点,大于等于就设置为 1,即黑色点。 最后调用 point 方法,根据点阵 table 进行二值化处理,即第二个参数传入 1。此时,这个图片就被按照我们的二值化点阵处理好了。此时理论上图片中的干扰线就会被除去。 **当然这个阈值你可以根据自己的图片进行调整,也可以进行更多的图像处理。** 同时附上我的四张下载的图片(你可以保存下载改成对应的文件名): ![tesserocr-5.jpg](http://static.fox-9.com/uploads/2021/08/19/tesserocr-5.jpg!webp "code.jpg") ![tesserocr-6.jpg](http://static.fox-9.com/uploads/2021/08/19/tesserocr-6.jpg!webp "code2.jpg") ![tesserocr-7.jpg](http://static.fox-9.com/uploads/2021/08/19/tesserocr-7.jpg!webp "code3.jpg") ![tesserocr-8.jpg](http://static.fox-9.com/uploads/2021/08/19/tesserocr-8.jpg!webp "code4.jpg") 接下来,在虚拟环境的 python 中运行该 python 脚本,结果报错了。 ![tesserocr-9.jpg](http://static.fox-9.com/uploads/2021/08/19/tesserocr-9.jpg!webp) 从报错信息来看,说的是在它所说的 `E:\ProgramFiles\Anaconda\envs\python3.7_for_tesserocr/tessdata/` 这个路径下找不到 `tessdata` 文件夹。 我一看,咦这不就是我用的虚拟环境的根目录么。 于是我去找到 tesseract 的安装目录,将 `tessdata` 文件夹复制到虚拟环境的根目录下,再次运行: ![tesserocr-10.jpg](http://static.fox-9.com/uploads/2021/08/19/tesserocr-10.jpg!webp) 可以看到,这一次成功进行了识别。 不过识别的准确度还是比较堪忧的,大家可以对照一下前面的几张 code 图片,对应的正确答案应该是什么。 我发现,在目前的代码简易处理方式下,当验证码中遇到 `0、o、O` 这些难以区分的字符时比较难辨认,当二值化处理后的字符,具有比较好的独特形状或排他性时识别度较好,比如 `code3.jpg` 就能完全正确识别。 你还能看一下二值化处理完毕后的图片长什么样,可以将我前面 python 代码中的 `image.show()` 这一行的注释取消,就能看到处理后的图片的样子了。 你还可以进行更多的这个库的用法的探索。 总之到这里我就基本从坑里爬起来了,虽然结局也不甚完美,但总归还是用上了不是?哈哈哈。 好了,感谢大家阅读完本文,我们下次再见! 最后修改:2021 年 08 月 19 日 © 允许规范转载 赞 赠人玫瑰,手留余香
1 条评论
谢谢