原文:【Win10 應用開發】OCR識別html
OCR,即Optical Character Recognition,光學字符識別。如下介紹來自搜索:dom
OCR(Optical Character
Recognition,光學字符識別)是指電子設備(例如掃描儀或數碼相機)檢查紙上打印的字符,經過檢測暗、亮的模式肯定其形狀,而後用字符識別方法將形狀翻譯成計算機文字的過程;即,針對印刷體字符,採用光學的方式將紙質文檔中的文字轉換成爲黑白點陣的圖像文件,並經過識別軟件將圖像中的文字轉換成文本格式,供文字處理軟件進一步編輯加工的技術。如何除錯或利用輔助信息提升識別正確率,是OCR最重要的課題,ICR(Intelligent
Character
Recognition)的名詞也所以而產生。衡量一個OCR系統性能好壞的主要指標有:拒識率、誤識率、識別速度、用戶界面的友好性,產品的穩定性,易用性及可行性等。異步
簡單地說吧,就是識別印刷品上面的文字,大概用得比較多的狀況是:用設備的攝像頭拍一張照片,照片中有文字,而後經過OCR技術將照片中的字符識別出來,轉化爲字符。順便說一下,若是想「幹壞事」的話,也能夠用OCR技術來識別一些簡單的圖片驗證碼,呵呵,不過,如今不少網站的驗證碼都比較「狡猾」,要準確識別出來不那麼容易。post
好了,接下來看看如何在UAP中使用OCR技術。性能
用於OCR識別的API主要在Windows.Media.Ocr命名空間下。用法以下:網站
一、調用IsLanguageSupported靜態方法檢查一下,是否支持某種語言文字的識別,如繁體中文、簡體中文等(估計它識別不了甲骨文和篆書)。this
二、調用OcrEngine.TryCreateFromLanguage方法從指定的語言建立OcrEngine實例;或者調用TryCreateFromUserProfileLanguages方法從用戶配置的語言中建立。這些方法都是靜態的,可直接訪問。url
三、調用OcrEngine實例的RecognizeAsync方法開始進行識別,識別完成後會異步返回OcrResult對象,其中對象中的Text屬性就是被識別出來的文本。RecognizeAsync方法須要一個Windows.Graphics.Imaging.SoftwareBitmap實例做爲參數,它經過BitmapDecoder類來獲取,就是要進行識別的圖片。spa
下面就用一個示例來演示一下。該例能夠選擇一張帶文字的圖片,而後識別出圖中的文本。代碼以下:翻譯
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
好,本次就扯到這裏,改天有空再吹。