使用Tesseract (OCR)實現簡單的驗證碼識別(C#)+窗體淡入淡出效果


來園子也有一段時間了,一直沒時間寫點東西,說實話剛開始也不知道寫什么,一直以來對驗證碼識別比較感興趣,曾經想着自己處理圖形實現識別驗證碼,不過感覺對我來說太難了,偶然中再網上發現了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);//淡出

 

 

效果呢就是這樣:

至此全部結束,第一次寫東西也不知道怎么寫,也沒什么技術含量,不過還是希望和大家一起學習,一起進步,有什么問題、指教請留言。。。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM