C# 手寫識別方案整理

2023-04-28 12:00:41

書寫識別,網上的大佬們都有輸出。

書寫識別存在的2個問題:

  1. 直接拿官網的案例(將 Windows Ink 筆劃識別為文字和形狀 - Windows apps | Microsoft Learn),會發現輸出準確度不高。
  2. 另外如果書寫過快,片語識別也是個問題,畢竟無法準確分割字之間的筆跡。

我結合之前開發經驗,整理下書寫識別比較完善的方案。

單個字的識別方案:

 1     private List<string> Recognize(StrokeCollection strokes)
 2     {
 3         if (strokes == null || strokes.Count == 0)
 4             return null;
 5         // 建立識別器
 6         var recognizers = new Recognizers();
 7         var chineseRecognizer = recognizers.GetDefaultRecognizer(0x0804);
 8         using var recContext = chineseRecognizer.CreateRecognizerContext();
 9         // 根據StrokeCollection構造 Ink 型別的筆跡資料。
10         using var stream = new MemoryStream();
11         strokes.Save(stream);
12         using var inkStorage = new Ink();
13         inkStorage.Load(stream.ToArray());
14         using var inkStrokes = inkStorage.Strokes;
15         //設定筆畫資料
16         using (recContext.Strokes = inkStrokes)
17         {
18             //識別筆畫資料
19             var recognitionResult = recContext.Recognize(out var statusResult);
20             // 如果識別過程中出現問題,則返回null
21             return statusResult == RecognitionStatus.NoError ?
22                 recognitionResult.GetAlternatesFromSelection().OfType<RecognitionAlternate>().Select(i => i.ToString()).ToList() :
23                 null;
24         }
25     }

多字的識別方案:

 1     public IEnumerable<string> Recognize(StrokeCollection strokes)
 2     {
 3         if (strokes == null || strokes.Count == 0)
 4             return null;
 5 
 6         using var analyzer = new InkAnalyzer();
 7         analyzer.AddStrokes(strokes,0x0804);
 8         analyzer.SetStrokesType(strokes, StrokeType.Writing);
 9         var status = analyzer.Analyze();
10         if (status.Successful)
11         {
12             var alternateCollection = analyzer.GetAlternates();
13             return alternateCollection.OfType<AnalysisAlternate>().Select(x => x.RecognizedString);
14         }
15         return null;
16     }

看下效果圖

 參照的名稱空間是:Windows.Ink和MicroSoft.Ink,需要參照的DLL檔案有四個。

IACore.dll、IALoader.dll、IAWinFX.dll,這三個DLL檔案都是Intel整合顯示卡驅動的重要組成部分,包含了圖形處理模組,尤其是IAWinFX為WPF應用提供了支援硬體加速的圖形渲染。

以及Microsoft.Ink.dll

值得說明一下,Windows.Ink與Microsoft.Ink在平臺支援上不同,如果有要適配不同版本的windows,需要去上方程式碼修改下

  • Microsoft.Ink 支援 Windows XP、Vista 和 Win7 等舊版 Windows,相容性高。但Win10及以上版本,官方推薦使用Windows.Ink
  • Windows.Ink,則僅支援Win8以上版本

DLL參照環境遇到問題,可以參考這篇部落格 【WPF】提高InkAnalyer手寫漢字識別的準確率 - 大佛腳下 - 部落格園 (cnblogs.com)

 

參考部落格列表:

C# vs2012 如何實現手寫識別?快來看看吧~_手寫識別控制元件_想吃米豆腐的部落格-CSDN部落格

C# 實現手寫輸入功能_zls365365的部落格-CSDN部落格

【WPF】提高InkAnalyer手寫漢字識別的準確率 - 大佛腳下 - 部落格園 (cnblogs.com)