C#使用Tesseract OCR 解析验证码

时间:2022-02-21 09:03:03

Tessnet官网:https://code.google.com/p/tesseract-ocr/

之前我在<<C#简单数字验证码解析>>一文中介绍了用C#识别简单不变形数字验证码,但是对于识别变形的C#使用Tesseract OCR 解析验证码 或生成位置变化比较频繁的C#使用Tesseract OCR 解析验证码 验证码的准确率却不高。

下面介绍一个开源的OCR引擎Tesseract2。值得庆幸的是虽然是开源的但是它的识别率较高,并不比其他引擎差劲。网上介绍Tessnet2也是当时时间排名第三的识别引擎,只是后来慢慢不维护了,目前是Google在维护,大家都知道Google 在搞电子图书馆,每天都有不同类目的书被扫描成电子版。所以有G老大维护,识别率差不到哪里去。呵呵。。别鄙视我。。。

Tessnet2 是用vc ++ 开发的,其中是生成Tessnet2.dll ,我们可以通过.net 来调用内部具体类库实现识别。

Tessnet2的使用:

1、点击http://files.cnblogs.com/zhuxiangyu/tessnet2_32.rar链接下载Tessnet2.dll ,

   Tessnet2是支持多国语的。语言包下载链接:http://code.google.com/p/tesseract-ocr/downloads/list

2、将Tessnet2.dll 添加到vs 引用中,和添加.net程序集一样。

3、用Tessnet2进行识别

12345678910111213141516 WebRequest request = WebRequest.Create("http://sz.2zf.cn/js/code2.asp");            WebResponse response = request.GetResponse();            Stream st = response.GetResponseStream();            Bitmap bitmap = (Bitmap)Bitmap.FromStream(st); UnCodebase ud =newUnCodebase(bitmap );            bitmap = ud.GrayByPixels();            ud.ClearNoise(128, 2);             pictureBox1.Image = bitmap ; tessnet2.Tesseract ocr =newtessnet2.Tesseract();//声明一个OCR类            ocr.SetVariable("tessedit_char_whitelist","0123456789");//设置识别变量,当前只能识别数字。            ocr.Init(Application.StartupPath +@"\\tmpe","eng",true);//应用当前语言包。注,Tessnet2是支持多国语的。语言包下载链接:http://code.google.com/p/tesseract-ocr/downloads/list            List<tessnet2.Word> result = ocr.DoOCR(bitmap , Rectangle.Empty);//执行识别操作            stringcode = result[0].Text;            textBox1.Text = code;

 

 

识别效果:

C#使用Tesseract OCR 解析验证码

代码下载:CSharp简单数字验证码解析.rar


示例代码运行时,有可能会报错:未能加载文件或程序集 试图加载格式不正确的程序。。。。等之信息吧,

解决方法:
将应用程序生成为Any CPU就可以了
反之,如果系统是64位的Win7,就应该将新项目的生成目标平台改为x86


综上:
64位的Win7 解决方案的生成目标平台设置为x86
32位操作系统 解决方案的生成目标平台设置为AnyCPU

另外一个网友的问题解决方法:

我遇到过这个问题有两次,不过环境不同。

第一次:Windows 2008 Server R2 64位;

第二次:Windows 7 64位;

原因分析:操作系统是64位的,但发布的程序引用了一些32位的ddl,所以出现了兼容性的问题。

解决方案:IIS——应用程序池——高级设置——启用32位应用程序 :true。



识别数字与字母代码如下:

tessocr.SetVariable("tessedit_char_whitelist", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");

有个软件中使用这个组件循环不停的ocr识别文本,然后问题来了,内存不停的往上飙,调用Dispose方法根本没用,解决办法如下:

把识别过程的代码封闭成一个控制台应用程序,通过参数调用,这样每识别一次,就会自动结束进程,内在也就释放了


Tesseract3.0教程:http://www.cnblogs.com/*s-dotnet/archive/2010/10/05/1844203.html