【Win10 應用開發】OCR識別

原文:【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

 好,本次就扯到這裏,改天有空再吹。

相關文章
相關標籤/搜索