C#圖片文字識別


1、

1、 前言
  光學字符識別(OCR,Optical Character Recognition)是指對文本資料進行掃描,然后對圖像文件進行分析處理,獲取文字及版面信息的過程。OCR技術非常專業,一般多是印刷、打印行業的從業人員使用,可以快速的將紙質資料轉換為電子資料。關於中文OCR,目前國內水平較高的有清華文通、漢王、尚書,其產品各有千秋,價格不菲。國外OCR 發展較早MODI,像一些大公司,如IBM、微軟、HP等,即使沒有推出單獨的OCR產品,但是他們的研發團隊早已掌握核心技術,將OCR功能植入了自身的軟件系統。
  MODI也就是Office 2003中的MicrosoftOffice Document Imaging 的縮寫,它是我們安裝Office時需要選擇安裝的一個組件。當我們安裝Office選擇安裝MODI后,我們就可以輕松的把MODI中的OCR功能添加掃我們的應用程序中去。在MODI的幫助下,我們只需要寫很少的代碼就能夠完成OCR的功能。
  2、 MODI的應用
  由於MODI組件是Office 2003自帶的一個組件,所以我們必須安裝Office 2003以上版本才會有MODI組件。當我們在使用MODI進行開發的時候,只要支持外部引用的編譯器都可以使用MODI組件。在這里我們使用C#來進行MODI程序的開發和示例。
  2.1 添加MODI組件
  我們首先需要添加MODI引用到我們的工程文件中去。我們在添加引用庫的時候,選擇COM組件庫,我們可以看到Microsoft Office DocumentImaging 11.0 Type Library組件(對應文件為MDIVWCTL.DLL)。添加成功后,我們可以在VS2008 C#的解決方案管理器的引用欄中看到MODI項,這就說明我們添加MODI成功了。
  2.2 利用MODI組件中的Document對象
  Document對象是MODI中最重要的一個對象,它提供了圖片的引入、掃描等重要的方法。在這里我們首先創建一個MODI中的Document對象的一個實例:
  MODI.Document_MODIDocument = newMODI.Document(); 
  然后把需要處理的文檔圖片准備好。圖片的格式為TIFF或者BMP。當然我們有必要首先對圖片進行一些必要的處理,盡量讓圖片干凈、清晰論文網站大全。然后可以利用Document對象中的Create()方法,引入圖片文檔:_MODIDocument.Create(filename);期中MODI,filename為圖片文檔的路徑。
  2.3 運用Document對象的OCR方法,進行文字的處理
  OCR( )方法是文字識別的一個重要的方法,它決定了圖片識別的精度。
  _MODIDocument.OCR(_MODIParameters.Language,
  _MODIParameters.WithAutoRotation, 
  _MODIParameters.WithStraightenImage);
  在調用了OCR方法之后,所有圖片的文檔就已經被處理好了。若圖片文檔有很多頁,如果想單獨的處理某一頁,可以調用MODIimage.OCR()方法來單獨處理。
   其中OCR()方法中有三個重要的參數,分別為:
  ①Language ②AutoRotation③StraightenImage
  這三個參數的設置是與圖片文檔上面的字符類型、格式密切相關的。
  其中,第一個參數Language,表示的是當前文檔上的字符是哪種語言的字符,我們只要選擇相對應的語言參數就可以了;
  第二個參數AutoRotation,是個布爾型的參數,表示的是自動旋轉設置。可能圖片的文檔方向不是正向的,所以需要設置這個參數來開啟是否自動旋轉功能;
  第三個參數StraightenImage,表示的是自動扶直圖片。當字體有傾斜時,設置此選項可以自動糾正文字的傾斜。
  這三個參數根據文檔的具體情況來設置,才能達到更精確的效果。下圖為選擇OCR參數后開始OCR的界面。
  MODI
  圖1 圖像文字識別
  2.4 追蹤OCR掃描的進度
  整個OCR過程可能會花去一些時間,我們可以關注這個掃描的過程。因此利用OnOCRProgress事件MODI,來跟蹤整個OCR的處理過程。
  利用下面的代碼,就可以跟蹤OCR的處理進度。
  _MODIDocument.OnOCRProgress += newMODI._IDocumentEvents_OnOCRProgressEventHandler(this.ShowProgress);
  public void ShowProgress(int progress,ref bool cancel)
  { statusBar1.Text =progress.ToString() + "% processed."; }
  2.5 利用MODI中的Document Viewer對象
  Document Viewer對象和Document對象一樣,都屬於同一個組件庫MDIVWCTL.DLL,只需要對Document Viewer有個簡單的聲明,就可以使用Document Viewer對象了。運用Document Viewer對象可以對圖片文件進行選擇、畫圖等操作。
  MODI.MiDocView ax MiDocView1=newMODI.MiDocView( );
  axMiDocView1.Document = _MODIDocument;
  處理OCR之后的結果
   for(inti=0;i<= axMiDocView1.PageNum;i++)
   {axMiDocView1.selectAll(i); }
  string ocrResult= axMiDocView1.TextSelection.Text.ToString();
   到這里就可以得到圖片文件中所包含的文字了。這里選擇圖一中的拷貝文字到剪貼板后,將文字拷貝到文本文件中,效果如下圖所示:
  MODI

  圖2 圖像文字識別結果

         也可通過以下途徑實現: 

// 引用 Interop.MODI.dll
// 識別率不是很高
private string OcrFunc(string imgfileName) // 參數為包含文本的圖片文件名
{
    var langs = MODI.MiLANGUAGES.miLANG_ENGLISH;
    // MODI.MiLANGUAGES.miLANG_CHINESE_SIMPLIFIED; 中文含英文
    // MODI.MiLANGUAGES.miLANG_JAPANESE; 日文含英文

    var doc = new MODI.Document();
    var image = default(MODI.Image);
    var layout = default(MODI.Layout);

    try
    {
        doc.Create(imgfileName);
        doc.OCR(langs, true, true);
        var sb = new StringBuilder();

        for (int i = 0; i < doc.Images.Count; i++)
        {
            image = (MODI.Image)doc.Images[i];
            layout = image.Layout;
            sb.AppendLine(string.Format("{0}, {1}", i, layout.Text));
        }
        doc.Close(false);
        return sb.ToString();
    }
    catch (System.Exception ex)
    {
        MessageBox.Show(ex.Message);
        return string.Empty;
    }
    finally
    {
        layout = null;
        image = null;
        doc = null;
    }
}

  3、 結果分析及其結論
  運用Office中自帶的MODI組件,可以快速而有效的編寫相關的OCR,但是識別精度和圖片文檔的質量與清晰度有關。運用MODI就可以很輕松的開發出很專業的OCR 程序,既節約了時間,又節約了成本。


2、

圖片識別的技術到幾天已經很成熟了,只是相關的資料很少,為了方便在此匯總一下(C#實現),方便需要的朋友查閱,也給自己做個記號。

 

圖片識別的用途:很多人用它去破解網站的驗證碼,用於達到自動刷票或者是批量注冊的目的,但我覺得它最吸引我的地方是可以讓一些書寫的東西,自動識別成電腦上的文字,比如說手擬的合同,修改過的書面論文或者是文檔,每月的花費發票需要在電腦上錄入或者是匯總信息,日記本上的文章要轉移到電腦上等等,我們現在就不用再頭痛把它們在電腦上敲寫一遍了。

 

 

本文介紹兩種比較主流和成熟的識別方式:

方式一、Asprise-OCR實現。

方式二、Microsoft Office Document Imaging(Office 2007) 組件實現。

 

方式一、Asprise-OCR的使用。

Asprise-OCR下載地址:

http://asprise.com/product/ocr/download.php?lang=csharp

其中需要使用的3個dll是AspriseOCR.dll、DevIL.dll、ILU.dll。

需要注意的是這幾個.dll是vc寫的引用要在程序中用DllImport引用,關鍵代碼:

[DllImport("AspriseOCR.dll", EntryPoint = "OCR", CallingConvention = CallingConvention.Cdecl)]

public static extern IntPtr OCR(string file, int type);

[DllImport("AspriseOCR.dll", EntryPoint = "OCRpart", CallingConvention = CallingConvention.Cdecl)]

static extern IntPtr OCRpart(string file, int type, int startX, int startY, int width, int height);

[DllImport("AspriseOCR.dll", EntryPoint = "OCRBarCodes", CallingConvention = CallingConvention.Cdecl)]

static extern IntPtr OCRBarCodes(string file, int type);

[DllImport("AspriseOCR.dll", EntryPoint = "OCRpartBarCodes", CallingConvention = CallingConvention.Cdecl)]

static extern IntPtr OCRpartBarCodes(string file, int type, int startX, int startY, int width, int height);

 

調用代碼很簡單只有一句:

MessageBox.Show(Marshal.PtrToStringAnsi(OCRpart(img_path, -1, startX, startY, width, height)));

其中img_path:為圖片路徑,startX、startY坐標均為0即可,width、height圖片的寬和高。

 

方式二、Microsoft Office Document Imaging(Office 2007) 組件實現。

在使用之前需要給大家說的是Imaging 組件的兼容性不是很好,使用win 7 office 2007的時必須打上office 2007 sp1或者sp2補丁,讀取中文才行。

sp1補丁地址(226M) :

http://download.microsoft.com/download/1/6/5/1659d607-8696-4001-8072-efaedd70dd30/office2007sp1-kb936982-fullfile-zh-cn.exe

sp2補丁地址(301 MB):

http://download.microsoft.com/download/A/3/9/A39E919E-AFA8-4128-9249-51629206C70F/office2007sp2-kb953195-fullfile-zh-cn.exe

 

給項目添加組件引用,如圖:

 

使用代碼:

MODI.Document doc = new MODI.Document();

doc.Create(img_Path);

MODI.Image image;

MODI.Layout layout;

doc.OCR(MODI.MiLANGUAGES.miLANG_CHINESE_SIMPLIFIED, true, true);  // 識別簡體中文

for (int i = 0; i < doc.Images.Count; i++)

{

    image = (MODI.Image)doc.Images[i];

    layout = image.Layout;

    sb.Append(layout.Text);

}

MessageBox.Show(sb.ToString());

其中img_Path為圖片路徑,MODI.MiLANGUAGES為讀取圖片的文字類型枚舉。

 

本文源碼下載地址:http://files.cnblogs.com/stone_w/OCR.rar


3、c#調用dll 實現圖像文字識別

請先下載http://asprise.com/product/ocr/index.php?lang=csharp 的SDK.里面提供了詳細的OCR方法,如下:

將發現圖像框picbVeryfyCode里的文字和文本框.txtVeryfyCode.Text是一致的.

數字識別率我碰到的幾乎是100%

[DllImport("AspriseOCR.dll")]
  static extern string craboOCR(string file, int type);

private void GetVeryfyCode()
  {
if(File.Exists(_imgPath))//ok now?
   {
    try
    {
    this.picbVeryfyCode.Image=System.Drawing.Bitmap.FromFile(_imgPath);
     _veryfyCode=craboOCR(_imgPath,-1);   //將返回string,並以"\r\n"結尾!!
     _veryfyCode=_veryfyCode.Substring(0,4);
     this.txtVeryfyCode.Text=_veryfyCode;
    }
    catch(Exception e)
    {
     this.lblResult.Text+=e.Message;
    }
   }
}




注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com