【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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM