標籤:
原文:【Win10 應用開發】OCR識別
OCR,即Optical Character Recognition,光學字元辨識。以下介紹來自搜尋:
OCR(Optical Character
Recognition,光學字元辨識)是指電子裝置(例如掃描器或數位相機)檢查紙上列印的字元,通過檢測暗、亮的模式確定其形狀,然後用字元識別方法將形狀翻譯成電腦文字的過程;即,針對印刷體字元,採用光學的方式將紙質文檔中的文字轉換成為黑白點陣的影像檔,並通過識別軟體將映像中的文字轉換成文字格式設定,供文文書處理軟體進一步編輯加工的技術。如何除錯或利用輔助資訊提高識別正確率,是OCR最重要的課題,ICR(Intelligent
Character
Recognition)的名詞也因此而產生。衡量一個OCR系統效能好壞的主要指標有:拒識率、誤識率、識別速度、使用者介面的友好性,產品的穩定性,易用性及可行性等。
簡單地說吧,就是識別印刷品上面的文字,大概用得比較多的情況是:用裝置的網路攝影機拍一張照片,照片中有文字,然後通過OCR技術將照片中的字元識別出來,轉化為字元。順便說一下,如果想“幹壞事”的話,也可以用OCR技術來識別一些簡單的圖片驗證碼,呵呵,不過,現在很多網站的驗證碼都比較“狡猾”,要準確識別出來不那麼容易。
好了,接下來看看如何在UAP中使用OCR技術。
用於OCR識別的API主要在Windows.Media.Ocr命名空間下。用法如下:
1、調用IsLanguageSupported靜態方法檢查一下,是否支援某種語言文字的識別,如繁體中文、簡體中文等(估計它識別不了甲骨文和篆書)。
2、調用OcrEngine.TryCreateFromLanguage方法從指定的語言建立OcrEngine執行個體;或者調用TryCreateFromUserProfileLanguages方法從使用者配置的語言中建立。這些方法都是靜態,可直接存取。
3、調用OcrEngine執行個體的RecognizeAsync方法開始進行識別,識別完成後會非同步返回OcrResult對象,其中對象中的Text屬性就是被識別出來的文本。RecognizeAsync方法需要一個Windows.Graphics.Imaging.SoftwareBitmap執行個體作為參數,它通過BitmapDecoder類來擷取,就是要進行識別的圖片。
下面就用一個樣本來示範一下。該例可以選擇一張帶文字的圖片,然後識別出圖中的文本。代碼如下:
FileOpenPicker picker = new FileOpenPicker(); picker.FileTypeFilter.Add(".jpg"); picker.FileTypeFilter.Add(".jpeg"); // 選擇檔案 StorageFile imgFile = await picker.PickSingleFileAsync(); if(imgFile != null) { using (IRandomAccessStream inStream = await imgFile.OpenReadAsync()) { // 顯示圖片 BitmapImage bmp = new BitmapImage(); bmp.DecodePixelWidth = 700; bmp.SetSource(inStream.CloneStream()); this.img.Source = bmp; // 解碼圖片 BitmapDecoder decoder = await BitmapDecoder.CreateAsync(BitmapDecoder.JpegDecoderId, inStream); // 擷取映像 SoftwareBitmap swbmp = await decoder.GetSoftwareBitmapAsync(); // 準備識別 Windows.Globalization.Language lang = new Windows.Globalization.Language("zh-CN"); // 判斷是否支援簡體中文識別 if (OcrEngine.IsLanguageSupported(lang)) { OcrEngine engine = OcrEngine.TryCreateFromLanguage(lang); if (engine != null) { OcrResult result = await engine.RecognizeAsync(swbmp); if (result != null) { tbResult.Text = result.Text; } } } else { Windows.UI.Popups.MessageDialog dialog = new Windows.UI.Popups.MessageDialog("不支援簡體中文的識別。"); await dialog.ShowAsync(); } } }
目前是支援簡體中文字元的識別,不過準確率還不能達到100%,97%的準確應該可以保證的。看看識別的結果:
從上面的結果來看,“兒”、“子”、“幾”三字沒有正確識別,準確率還過得去。
樣本源碼下載:http://files.cnblogs.com/files/tcjiaan/OcrApp.zip
好,本次就扯到這裡,改天有空再吹。
【Win10 應用開發】OCR識別