.Net使用 Tesseract 框架识别简单验证码
1.图片验证码生成
public class CaptchaGenerator { public static string GetRandomAuthcode(int length) { string chkCode = string.Empty; //验证码的字符集,去掉了一些容易混淆的字符 char[] character = { '0', '1', '2', '3', '4', '5', '6', '8', '9' }; Random rnd = new Random(); //生成验证码字符串 for (int i = 0; i < length; i++) { chkCode += character[rnd.Next(character.Length)]; } return chkCode; } public static void GetImage( int imageWidth = 110, int imageHeight = 30) { var authcode = GetRandomAuthcode(5); //字体列表,用于验证码 string[] font = { "Times New Roman", "MS Mincho", "Book Antiqua", "Gungsuh", "PMingLiU", "Impact" }; using Bitmap bmp = new Bitmap(imageWidth, imageHeight); Graphics g = Graphics.FromImage(bmp); g.Clear(Color.White); //画验证码字符串 for (int i = 0; i < authcode.Length; i++) { string fnt = font[0]; Font ft = new Font(fnt, 14); Color clr = Color.Black; g.DrawString(authcode[i].ToString(), ft, new SolidBrush(clr), (float)i * 20 + 8, (float)4); } g.DrawRectangle(new Pen(Color.Blue, 1), 0, 0, bmp.Width - 1, bmp.Height - 1); var tellIFileName = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "1024.png"); bmp.Save(tellIFileName, System.Drawing.Imaging.ImageFormat.Png); } }
2.根据训练模型识别验证码
// 简单图片识别 static void Main(string[] args) { // 随机生成一张图片 CaptchaGenerator.GetImage(); var tellIFileName = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "1024.png"); // tessdata 文件下放在的 code 是我们训练好了的模型 using (var engine = new TesseractEngine("tessdata", "code", EngineMode.TesseractOnly)) { using (var img = Pix.LoadFromFile(tellIFileName)) { using (var page = engine.Process(img)) { var txtResult = page.GetText().Trim(); Console.WriteLine(txtResult); } } } Console.ReadKey(); }
3.结果演示
4.Tesseract-OCR样本训练
Tesseract是一个开源的OCR(Optical Character Recognition,光学字符识别)引擎,可以识别多种格式的图像文件并将其转换成文本,目前已支持60多种语言(包括中文)。 Tesseract最初由HP公司开发,后来由Google维护。
(1).从https://github.com/UB-Mannheim/tesseract/wiki下载tesseract安装包,目前最新的版本是tesseract-ocr-w64-setup-v4.0.0.20181030.exe。
(2).从https://sourceforge.net/projects/vietocr/files/jTessBoxEditor/下载jTessBoxEditor训练工具,目前最新的版本是jTessBoxEditor-2.2.0.zip。
(3).由于jTessBoxEditor是用Java开发的,需要安装Java虚拟机才能运行。从https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html下载Java JDK,目前最新的版本事jdk-8u191-windows-x64.exe。
(4)安装步骤省略
(5)打开jTessBoxEditor
5.制作样本
(1)运行jTessBoxEditor工具,点击Tools。
(2)点击Merge TIFF。
(3) 文件类型选择All Image Files,选择样本图片,点击打开。
(4)文件名输入num.font.exp0.tif,文件类型选择TIFF,点击保存。
(5)点击确定
(6)将num.font.exp0.tif文件复制到Tesseract-OCR安装目录。
(7)生成Box File文件。打开cmd命令行,以管理员身份运行
(8)进入Tesseract-OCR安装目录
(9).执行命令:
tesseract.exe num.font.exp0.tif num.font.exp0 batch.nochop makebox
生成的box文件为num.font.exp0.box,box文件为Tesseract识别出的字符及其坐标。
注:Make Box File 文件名有一定的格式,不能随便乱取名字,命令格式为:
tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] batch.nochop makebox
其中lang为语言名称,fontname为字体名称,num为序号,可以随便定义。
(10). 将上一步生成的.box和.tif样本文件放在同一目录。我是放在Tesseract-OCR默认安装目录下。
(11).运行jTessBoxEditor工具,点击Box Editor。
(12)点击Open。
(13)选择之前生成的num.font.exp0.tif,点击打开。
(14)
可以看出有些字符识别的位置不准确,可以通过该工具手动对每张图片中识别错误的字符和位置进行校正。校正完成后保存即可。
注: 这里必须修改识别错误的字符,否则做出来的traineddata文件也是错的。可以在下面的界面中修改并保存,也可以直接在traineddata文件中修改。
(15)
定义字体特征文件。创建一个名称为font_properties的字体特征文件。font_properties不含有BOM头,文件内容格式如下:
<fontname> <italic> <bold> <fixed> <serif> <fraktur>
其中fontname为字体名称,必须与[lang].[fontname].exp[num].box中的名称保持一致。<italic> 、<bold> 、<fixed> 、<serif>、 <fraktur>的取值为1或0,表示字体是否具有这些属性。
这里在样本图片所在目录下创建一个名称为font_properties的文件,用记事本打开,输入以下下内容:
font 0 0 0 0 0
这里全取值为0,表示字体不是粗体、斜体等等。
(16)
生成语言文件。在样本图片所在目录下创建一个批处理文件,输入如下内容:
rem 执行改批处理前先要目录下创建font_properties文件
echo Run Tesseract for Training..
tesseract.exe num.font.exp0.tif num.font.exp0 nobatch box.train
echo Compute the Character Set..
unicharset_extractor.exe num.font.exp0.box
mftraining -F font_properties -U unicharset -O num.unicharset num.font.exp0.tr
echo Clustering..
cntraining.exe num.font.exp0.tr
echo Rename Files..
rename normproto num.normproto
rename inttemp num.inttemp
rename pffmtable num.pffmtable
rename shapetable num.shapetable
echo Create Tessdata..
combine_tessdata.exe num.
(17)执行批处理文件, num.traineddata便是最终生成的语言文件,将生成的num.traineddata拷贝到程序的样本文件夹里,就可以使用了。
(18)把我们训练的模型拷贝过到我们的语言模型中去测试
结果如下:
附上程序和工具
tesseract-ocr-w64-setup-5.3.1.20230401
https://pan.baidu.com/s/1o3xJ-IBPguvUTtJoULbpsw 提取码: 657q
jTessBoxEditor-2.4.1
链接: https://pan.baidu.com/s/1fAAvYivDhqFAprKjNWYVPg 提取码: 657q
demo程序
链接: https://pan.baidu.com/s/11y9Lhtg8eKoXnv5qzPnHlw 提取码: 657q