使用(ImageMagick+tesseract-ocr)实现图像验证码识别实例
2012-10-09 16:22
791 查看
最近在搞一个无人值守系统时,需要能自动登录,在登录时需要输入验证码,所以研究了验证码识别技术,否则我这个无人值守系统的作用就没有了。目前只测试了字母和数字的识别,准确率还是可以的,呵呵,已经够我自已用了~~,至于中文的识别可以参考我上篇文章:利用开源程序(ImageMagick+tesseract-ocr)实现图像验证码识别。
验证码识别率如下图:(准确率还可以吧)
好吧,切入正题,赶快上架源码吧~~,不足之处请多多包涵
注意:在使用验证码识别类之前,一、请先安装好ImageMagick,二、需要下载tesseract-2.04.exe.tar.gz和tesseract-2.00.eng.tar.gz,并解压内容到tesseract目录中,之后拷备tesseract目录至应用程序下(debug目录下)
一、图片识别,验证识别类
二、C#中执行命令行命令的函数
验证码识别率如下图:(准确率还可以吧)
好吧,切入正题,赶快上架源码吧~~,不足之处请多多包涵
注意:在使用验证码识别类之前,一、请先安装好ImageMagick,二、需要下载tesseract-2.04.exe.tar.gz和tesseract-2.00.eng.tar.gz,并解压内容到tesseract目录中,之后拷备tesseract目录至应用程序下(debug目录下)
一、图片识别,验证识别类
/// <summary> /// 图片识别,验证识别 /// </summary> public class Identify { /// <summary> /// 功能描述:静态成员 识别数字、字母,验证码等图片上的内容 /// </summary> /// <param name="img_path">待识别内容的图片</param> /// <param name="save_dir">识别内容保存目录</param> /// <param name="scale">放大处理比率(建议值范围:100~1000)-(参数:提高识别成功率)</param> /// <returns></returns> public static string StartIdentifyingCaptcha(string img_path, string save_dir,int scale) { return StartIdentifyingCaptcha(img_path, save_dir, 4, 0, scale); } /// <summary> /// 功能描述:静态成员 识别数字、字母,验证码等图片上的内容 /// </summary> /// <param name="img_path">待识别内容的图片</param> /// <param name="save_dir">识别内容保存目录</param> /// <param name="content_type">内容分类(0:纯数字 1:纯字母 2:数字与字母混合 3:纯汉字,4、中英文混合)-(参数:提高识别成功率)</param> /// <param name="content_length">内容长度(参数:提高识别成功率)</param> /// <param name="scale">放大处理比率(建议值范围:100~1000)-(参数:提高识别成功率)</param> /// <returns></returns> public static string StartIdentifyingCaptcha(string img_path, string save_dir, byte content_type, int content_length, int scale) { string captcha = ""; // 识别的验证码 //int captcha_length = 6; // 验证码长度(参数:提高识别成功率) //int scale = 730; // 放大处理比率(参数:提高识别成功率) do { // 识别验证码(一、安装ImageMagick,二、拷备tesseract目录至应用程序下) Common.StartProcess("cmd.exe", new string[] { "cd tesseract" , // 输换图片 String.Format(@"convert.exe -compress none -depth 8 -alpha off -scale {0}% -colorspace gray {1} {2}\captcha.tif",scale,img_path,save_dir), // 识别图片 String.Format(@"tesseract.exe {0}\captcha.tif {0}\result",save_dir), "exit"}); // 读取识别的验证码 StreamReader reader = new StreamReader(String.Format(@"{0}\result.txt", save_dir)); captcha = reader.ReadLine().Trim(); reader.Close(); // 匹配规则 string pattern = ""; // 纯数字 if (content_type == 0) { pattern = (content_length > 0) ? "^[0-9]{" + content_length + "}$" : "^[0-9]+$"; } // 纯字母 else if (content_type == 1) { pattern = (content_length > 0) ? "^[a-zA-Z]{" + content_length + "}$" : "^[a-zA-Z]+$"; } // 数字与字母混合 else if (content_type == 2) { pattern = (content_length > 0) ? "^[a-zA-Z0-9]{" + content_length + "}$" : "^[a-zA-Z0-9]+$"; } // 纯汉字 else if (content_type == 3) { pattern = (content_length > 0) ? "^[\u4e00-\u9fa5]{" + content_length + "}$" : "^[\u4e00-\u9fa5]+$"; } // 中英文混合 else { pattern = (content_length > 0) ? "^[A-Za-z0-9\u4e00-\u9fa5]{" + content_length + "}$" : "^[A-Za-z0-9\u4e00-\u9fa5]+$"; } // 识别失败,调整放大比率重新识别 if (pattern != "" && !Regex.IsMatch(captcha, pattern)) { captcha = ""; scale++; } // 放大比率为9倍时,仍无法识别,认为识别失败,退出识别 if (scale > 900) { captcha = ""; break; } } while (captcha == ""); return captcha; } }
二、C#中执行命令行命令的函数
public class Common { #region 功能描述:静态成员 C#里运行命令行里的命令 /// <summary> /// 功能描述:静态成员 C#里运行命令行里的命令 /// </summary> /// <param name="startFileName">要启动的应用程序</param> /// <param name="commands">命令行数组</param> /// <returns></returns> public static string StartProcess(string startFileName, string[] commands) { //实例一个Process类,启动一个独立进程 Process p = new Process(); //Process类有一个StartInfo属性,这个是ProcessStartInfo类,包括了一些属性和方法, //下面我们用到了他的几个属性: //设定程序名 p.StartInfo.FileName = startFileName; //关闭Shell的使用 p.StartInfo.UseShellExecute = false; //重定向标准输入 p.StartInfo.RedirectStandardInput = true; //重定向标准输出 p.StartInfo.RedirectStandardOutput = true; //重定向错误输出 p.StartInfo.RedirectStandardError = true; //设置不显示窗口 p.StartInfo.CreateNoWindow = true; //上面几个属性的设置是比较关键的一步。 //既然都设置好了那就启动进程吧 p.Start(); //输入要执行的命令 foreach (string command in commands) { p.StandardInput.WriteLine(command); } //从输出流获取命令执行结果 return p.StandardOutput.ReadToEnd(); } #endregion }
相关文章推荐
- 【识别码】使用(ImageMagick+tesseract-ocr)实现图像验证码识别实例
- 利用开源程序(ImageMagick+tesseract-ocr)实现图像验证码识别
- 利用开源程序(ImageMagick+tesseract-ocr)实现图像验证码识别
- 利用开源程序(ImageMagick+tesseract-ocr)实现图像验证码识别
- 利用开源程序(ImageMagick+tesseract-ocr)实现图像验证码识别
- 利用开源程序(ImageMagick+tesseract-ocr)实现图像验证码识别
- 利用开源程序(ImageMagick+tesseract-ocr)实现图像验证码识别
- Perl使用Tesseract-OCR实现验证码识别教程
- python图像上面字符的识别之tesseract—OCR和中文包的下载使用
- Java OCR tesseract 图像智能字符识别技术 Java代码实现
- Java OCR tesseract 图像智能字符识别技术 Java代码实现
- Java OCR tesseract 图像智能字符识别技术 Java代码实现
- Java OCR tesseract 图像智能文字字符识别技术实例代码
- Java使用OpenCV和Tesseract-OCR实现银行卡图片处理与卡号识别
- OCR图像识别技术的JAVA实现(二)之Tess4J的使用
- Java OCR tesseract 图像智能字符识别技术 Java代码实现
- Java OCR tesseract 图像智能字符识别技术 Java代码实现(二)
- Java OCR tesseract 图像智能字符识别技术 Java代码实现
- Java OCR tesseract 图像智能字符识别技术 Java实现
- Java OCR tesseract 图像智能字符识别技术 Java代码实现