VeryfyCode里的文字和文本框.txtVeryfyCode.Text是一致的.
數(shù)字識別率我碰到的幾乎是100%1、 前言
光學(xué)字符識別(OCR,Optical Character Recognition)是指對文本資料進(jìn)行掃描,然后對圖像文件進(jìn)行分析處理,獲取文字及版面信息的過程。OCR技術(shù)非常專業(yè),一般多是印刷、打印行業(yè)的從業(yè)人員使用,可以快速的將紙質(zhì)資料轉(zhuǎn)換為電子資料。關(guān)于中文OCR,目前國內(nèi)水平較高的有清華文通、漢王、尚書,其產(chǎn)品各有千秋,價格不菲。國外OCR 發(fā)展較早MODI,像一些大公司,如IBM、微軟、HP等,即使沒有推出單獨(dú)的OCR產(chǎn)品,但是他們的研發(fā)團(tuán)隊早已掌握核心技術(shù),將OCR功能植入了自身的軟件系統(tǒng)。
MODI也就是Office 2003中的MicrosoftOffice Document Imaging 的縮寫,它是我們安裝Office時需要選擇安裝的一個組件。當(dāng)我們安裝Office選擇安裝MODI后,我們就可以輕松的把MODI中的OCR功能添加掃我們的應(yīng)用程序中去。在MODI的幫助下,我們只需要寫很少的代碼就能夠完成OCR的功能。
2、 MODI的應(yīng)用
由于MODI組件是Office 2003自帶的一個組件,所以我們必須安裝Office 2003以上版本才會有MODI組件。當(dāng)我們在使用MODI進(jìn)行開發(fā)的時候,只要支持外部引用的編譯器都可以使用MODI組件。在這里我們使用C#來進(jìn)行MODI程序的開發(fā)和示例。
2.1 添加MODI組件
我們首先需要添加MODI引用到我們的工程文件中去。我們在添加引用庫的時候,選擇COM組件庫,我們可以看到Microsoft Office DocumentImaging 11.0 Type Library組件(對應(yīng)文件為MDIVWCTL.DLL)。添加成功后,我們可以在VS2008 C#的解決方案管理器的引用欄中看到MODI項,這就說明我們添加MODI成功了。
2.2 利用MODI組件中的Document對象
Document對象是MODI中最重要的一個對象,它提供了圖片的引入、掃描等重要的方法。在這里我們首先創(chuàng)建一個MODI中的Document對象的一個實例:
MODI.Document_MODIDocument = newMODI.Document();
然后把需要處理的文檔圖片準(zhǔn)備好。圖片的格式為TIFF或者BMP。當(dāng)然我們有必要首先對圖片進(jìn)行一些必要的處理,盡量讓圖片干凈、清晰論文網(wǎng)站大全。然后可以利用Document對象中的Create()方法,引入圖片文檔:_MODIDocument.Create(filename);期中MODI,filename為圖片文檔的路徑。
2.3 運(yùn)用Document對象的OCR方法,進(jìn)行文字的處理
OCR( )方法是文字識別的一個重要的方法,它決定了圖片識別的精度。
_MODIDocument.OCR(_MODIParameters.Language,
_MODIParameters.WithAutoRotation,
_MODIParameters.WithStraightenImage);
在調(diào)用了OCR方法之后,所有圖片的文檔就已經(jīng)被處理好了。若圖片文檔有很多頁,如果想單獨(dú)的處理某一頁,可以調(diào)用MODIimage.OCR()方法來單獨(dú)處理。
其中OCR()方法中有三個重要的參數(shù),分別為:
①Language ②AutoRotation③StraightenImage
這三個參數(shù)的設(shè)置是與圖片文檔上面的字符類型、格式密切相關(guān)的。
其中,第一個參數(shù)Language,表示的是當(dāng)前文檔上的字符是哪種語言的字符,我們只要選擇相對應(yīng)的語言參數(shù)就可以了;
第二個參數(shù)AutoRotation,是個布爾型的參數(shù),表示的是自動旋轉(zhuǎn)設(shè)置。可能圖片的文檔方向不是正向的,所以需要設(shè)置這個參數(shù)來開啟是否自動旋轉(zhuǎn)功能;
第三個參數(shù)StraightenImage,表示的是自動扶直圖片。當(dāng)字體有傾斜時,設(shè)置此選項可以自動糾正文字的傾斜。
這三個參數(shù)根據(jù)文檔的具體情況來設(shè)置,才能達(dá)到更精確的效果。下圖為選擇OCR參數(shù)后開始OCR的界面。
圖2 圖像文字識別結(jié)果
也可通過以下途徑實現(xiàn):
// 引用 Interop.MODI.dll
// 識別率不是很高
private string OcrFunc(string imgfileName) // 參數(shù)為包含文本的圖片文件名
{
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;
}
}
2、
圖片識別的技術(shù)到幾天已經(jīng)很成熟了,只是相關(guān)的資料很少,為了方便在此匯總一下(C#實現(xiàn)),方便需要的朋友查閱,也給自己做個記號。
圖片識別的用途:很多人用它去破解網(wǎng)站的驗證碼,用于達(dá)到自動刷票或者是批量注冊的目的,但我覺得它最吸引我的地方是可以讓一些書寫的東西,自動識別成電腦上的文字,比如說手?jǐn)M的合同,修改過的書面論文或者是文檔,每月的花費(fèi)發(fā)票需要在電腦上錄入或者是匯總信息,日記本上的文章要轉(zhuǎn)移到電腦上等等,我們現(xiàn)在就不用再頭痛把它們在電腦上敲寫一遍了。
本文介紹兩種比較主流和成熟的識別方式:
方式一、Asprise-OCR實現(xiàn)。
方式二、Microsoft Office Document Imaging(Office 2007) 組件實現(xiàn)。
方式一、Asprise-OCR的使用。
Asprise-OCR下載地址:
http://asprise.com/product/ocr/download.php?lang=csharp
其中需要使用的3個dll是AspriseOCR.dll、DevIL.dll、ILU.dll。
需要注意的是這幾個.dll是vc寫的引用要在程序中用DllImport引用,關(guān)鍵代碼:
[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);
調(diào)用代碼很簡單只有一句:
MessageBox.Show(Marshal.PtrToStringAnsi(OCRpart(img_path, -1, startX, startY, width, height)));
其中img_path:為圖片路徑,startX、startY坐標(biāo)均為0即可,width、height圖片的寬和高。
方式二、Microsoft Office Document Imaging(Office 2007) 組件實現(xiàn)。
在使用之前需要給大家說的是Imaging 組件的兼容性不是很好,使用win 7 office 2007的時必須打上office 2007 sp1或者sp2補(bǔ)丁,讀取中文才行。
sp1補(bǔ)丁地址(226M) :
sp2補(bǔ)丁地址(301 MB):
給項目添加組件引用,如圖:
使用代碼:
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#調(diào)用dll 實現(xiàn)圖像文字識別
請先下載http://asprise.com/product/ocr/index.php?lang=csharp 的SDK.里面提供了詳細(xì)的OCR方法,如下:
將發(fā)現(xiàn)圖像框picbVeryfyCode里的文字和文本框.txtVeryfyCode.Text是一致的.
數(shù)字識別率我碰到的幾乎是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"結(jié)尾!!
_veryfyCode=_veryfyCode.Substring(0,4);
this.txtVeryfyCode.Text=_veryfyCode;
}
catch(Exception e)
{
this.lblResult.Text+=e.Message;
}
}
}