來園子也有一段時間了,一直沒時間寫點東西,說實話剛開始也不知道寫什么,一直以來對驗證碼識別比較感興趣,曾經想着自己處理圖形實現識別驗證碼,不過感覺對我來說太難了,偶然中再網上發現了Tesseract,於是就想借助Tesseract 來實現簡單驗證碼的識別,正好今天周末有時間寫了這點東西。
1、Tesseract介紹:
Tesseract的OCR引擎最先由HP實驗室於1985年開始研發,至1995年時已經成為OCR業內最准確的三款識別引擎之一。然而,HP不久便決定放棄OCR業務,Tesseract也從此塵封。數年以后,HP意識到,與其將Tesseract束之高閣,不如貢獻給開源軟件業,讓其重煥新生--2005年,Tesseract由美國內華達州信息技術研究所獲得,並求諸於Google對Tesseract進行改進、消除Bug、優化工作。
2、下載 Tesseract:
http://code.google.com/p/tesseract-ocr/downloads/list ,可以到這里下載一些識別必須的文件。
3、編寫代碼:
Tesseract可以在命令行中運行,但覺得不太好用,於是就通過代碼調用DOS命令實現圖像識別
using System.Diagnostics; Process p = new Process(); p.StartInfo.FileName = "cmd.exe "; p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardInput = true; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.RedirectStandardError = true; p.StartInfo.CreateNoWindow = true; p.Start(); string cmd = "tesseract.exe " + PicPath + " " + filename + " -l chi_sim";//主要這句代碼在起作用 p.StandardInput.WriteLine(cmd); p.Close();
圖片識別以后會把識別的內容保存在一個txt文件中,我們可以通過代碼將保存在txt文件中的內容讀出來,直觀的顯示出來
讀取txt文件
public static string LoadDataFromTXT(string filePath) { string[] line = System.IO.File.ReadAllLines(filePath); return line[0]; }
這樣運行以后就可以看到這樣的效果
經過多次實驗發現對於這種簡單的數字驗證碼,識別正確率還是非常高的,但是對於我們中華民族博大精深的漢字,它表現的是否也如此優秀呢?那就讓我們來做一下實驗。。
在網上隨便截一張帶有漢字的圖片:
讓我們來看看漢字的識別效果吧:
大家看了一定很失望吧,對於漢字不是太給力,得到的結果亂七八糟,根本不能用,還要有很大的改進之處啊。。。不過它還是為我們識別一般驗證碼提供了方便。。
到這也基本講完了,順便講一下如何實現窗體淡入淡出效果
using System.Runtime.InteropServices; public class Win32 { public const Int32 AW_HOR_POSITIVE = 0x00000001; // 從左到右打開窗口 public const Int32 AW_HOR_NEGATIVE = 0x00000002; // 從右到左打開窗口 public const Int32 AW_VER_POSITIVE = 0x00000004; // 從上到下打開窗口 public const Int32 AW_VER_NEGATIVE = 0x00000008; // 從下到上打開窗口 public const Int32 AW_CENTER = 0x00000010; public const Int32 AW_HIDE = 0x00010000; // 在窗體卸載時若想使用本函數就得加上此常量 public const Int32 AW_ACTIVATE = 0x00020000; //在窗體通過本函數打開后,默認情況下會失去焦點,除非加上本常量 public const Int32 AW_SLIDE = 0x00040000; public const Int32 AW_BLEND = 0x00080000; // 淡入淡出效果 [DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern bool AnimateWindow( IntPtr hwnd, // handle to window int dwTime, // duration of animation int dwFlags // animation type ); } Win32.AnimateWindow(this.Handle, 1000, Win32.AW_BLEND);//淡入 Win32.AnimateWindow(this.Handle, 1000, Win32.AW_SLIDE | Win32.AW_HIDE | Win32.AW_BLEND);//淡出
效果呢就是這樣:
至此全部結束,第一次寫東西也不知道怎么寫,也沒什么技術含量,不過還是希望和大家一起學習,一起進步,有什么問題、指教請留言。。。