验证码,英文名CAPTCHA,全称叫做:全自动区分计算机和人类的图灵测试。验证码主要为了防一些不怀好意的人(程序猿),避免批量注册账户,暴力尝试多次登录失败等一些恶意行为。
最经典的就是文字型的验证码:
简单的文字型验证码容易被OCR识别,所以程序猿们让文字随机旋转、扭曲、黏连,在验证码上加干扰线、加噪点以降低自动化程序的识别率,但是很多扭曲变形的文字连人都识别不出来,比如中国移动这个验证码:
这些诡异的验证码反而降低了用户体验,所以现在比较流行的是行为式验证码
这篇文章主要讨论入门级的传统文字型验证码的识别。
因为我自己也没有深入研究过图形学,所以这里拿一个最简单验证码举例:
Tesseract
这里用开源的Tesseract-OCR引擎来识别字符,Tesseract目前最新版是4.0,Wiki里给出了各平台的安装方式。
tesseract-ocr是谷歌赞助开发的一款开源的光学字符识别(Optical character recognition)引擎,通常拿来进行文档扫描,图片字符识别。最常见的例子就是车牌号的识别与pdf扫描
Windows下载地址:https://github.com/tesseract-ocr/tesseract/wiki/Downloads
除了软件安装包,还有官方提供的训练数据:https://github.com/tesseract-ocr/tesseract/wiki/Data-Files
我们需要设置TESSDATA_PREFIX
变量为训练数据所在的目录。
将Tesseract安装目录配置到环境变量后,我们可以直接用tesseract
命令来对上面的验证码进行识别:
--psm
选项用于是page segmentation mode
,用于设置分页模式,tesseract有13中分页模式,因为验证码中字符基本在一行显示,所以选用7
单行文本模式。
stdout
表示我们将识别结果输出到标准输出流(也就是控制台),如果你想把识别结果输出到一个文件中可以直接指定文件名。比如tesseract CheckCode.jpg --psm 7 out