Tesseract3.02在VS2012中的使用方法
Tesseract3.02是Google维护的一个OCR识别图片文字的开源项目。而A .Net wrapper for tesseract-ocr则是可供.Net平台应用程序使用Tesseract3.02的程序包,由Charles Weld在Github上创建的开源项目,下载量大且持续更新,至本文发布该项目最新更新日期为2015/7/25,值得程序员们信赖。本文和大家分享通过A .Net wrapper for tesseract-ocr在VS2012工程中使用Tesseract3.02的方法。
在验证码识别之C#图像识别类库tessnet2一文中我通过tessnet2来使用Tesseract,但是tessnet2适用于.net framework 2.0(VS2008),我现在的VS环境已更新为VS2012,因此要想在VS2012中继续使用Tesseract,就必须另辟蹊径。
1.Tesseract3.02示例项目界面
这个界面仍以NyDus登录界面中的验证码为例,先用WebBrowser与mshtml获取动态验证码的方法获取验证码,然后用Tesseract3.02对该验证码进行识别。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using mshtml;//需要提前添加引用:添加引用-->COM-->Microsoft HTML Object Library using Tesseract; using Preprocess; namespace LOGIN { public partial class Form1 : Form { public Form1() { InitializeComponent(); this.txtUrl.Text = "http://www.nydus2015.info/login?callback=/loginbbs"; this.webBrowser1.Navigate(this.txtUrl.Text); } private void btnGetImage_Click(object sender, EventArgs e) { //取得验证码 HtmlElement ImgeTag = webBrowser1.Document.GetElementById("codeimg");//webBrowser1.Document.All["img"]; Image numPic = GetWebImage(webBrowser1, ImgeTag); // 得到验证码图片 pictureBox1.Image = numPic; } /// <summary> /// 返回指定WebBrowser中图片<IMG></IMG>中的图内容 /// </summary> /// <param name="WebCtl">WebBrowser控件</param> /// <param name="ImgeTag">IMG元素</param> /// <returns>IMG对象</returns> private Image GetWebImage(WebBrowser WebCtl, HtmlElement ImgeTag) { HTMLDocument doc = (HTMLDocument)WebCtl.Document.DomDocument; HTMLBody body = (HTMLBody)doc.body; IHTMLControlRange rang = (IHTMLControlRange)body.createControlRange(); IHTMLControlElement Img = (IHTMLControlElement)ImgeTag.DomElement; //图片地址 Image oldImage = Clipboard.GetImage(); rang.add(Img); rang.execCommand("Copy", false, null); //拷贝到内存 Image numImage = Clipboard.GetImage(); string resultStr = StartOCR(numImage); label1.Text = resultStr; try { Clipboard.SetImage(oldImage); } catch { } return numImage; } public string StartOCR(Image numImage) { string txt = ""; string defaultList = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; const string language = "eng"; //Nuget安装的Tessract版本为3.02,tessdata的版本必须与其匹配,另外路径最后必须以"\"或者"/"结尾 const string TessractData = @"D:\CSharp\LOGIN\LOGIN\tessdata\"; Tesseract.TesseractEngine test = new Tesseract.TesseractEngine(TessractData,language); test.SetVariable("tessedit_char_whitelist", defaultList); Bitmap tmpVal = (Bitmap)numImage; Bitmap tmpBmp = Preprocess.Preprocess.Sauvola(tmpVal); pictureBox2.Image = (Image)tmpBmp; Page tmpPage = test.Process(tmpBmp, pageSegMode: test.DefaultPageSegMode); txt = tmpPage.GetText(); return txt; } private void button1_Click(object sender, EventArgs e) { webBrowser1.Refresh(); } } } |
实现过程中有几个细节需要注意:
1.1 通过WebBrowser获取的验证码图片的类型为Image,而Tesseract3.02要求输入的图片类型为BMP,我尝试将Image强制转换为BMP,但强制转换后的格式为Format32bppRgb,Tesseract3.02是不支持这个格式的,所以在程序中进行强制转换后又对图片进行了二值化处理。
1.2 Tesseract3.02用到的tessdata必须与Tesseract的版本相符,且其路径必须以“\”或”/”结尾,否则会出错。
1.3 Tesseract3.02的使用方法与Tessnet2不一样,网上找不到参考资料。我根据Tesseract3.02所包含的函数推测其用法应该如此,但是目前验证下来识别率不高,而且即便能识别的最后会多出一个字母”I’,不知是何缘由。
那么怎样才可以将Tesseract3.02引入到我们的VS2012工程中呢?请看下一节。
2. A .Net wrapper for tesseract-ocr
在NuGet中搜索A .Net wrapper for tesseract-ocr,找到后即可轻松下载安装。VS2012中的NuGet需要自行安装,网上攻略比比皆是,大家自行下载安装即可。安装完成后,在VS2012工程中添加using Tesseract即可。
安装后如果用着不爽,也可以通过NuGet–>已安装的包,通过相应程序包的“管理”按钮即可进行卸载。
Preprocess.Preprocess.Sauvola(tmpVal);???
不好意思,自学C#,命名空间,类名等命名不规范,所以导致看起来很奇怪。我将一个用于预处理图片的文件的namespace命名为Preprocess,在该namespace下又有一个名为Preprocess的类,该类下有一个名为sauvola的函数。见笑了,以后改进…