書寫識別,網上的大佬們都有輸出。 書寫識別存在的2個問題: 直接拿官網的案例(將 Windows Ink 筆劃識別為文本和形狀 - Windows apps | Microsoft Learn),會發現輸出準確度不高。 另外如果書寫過快,片語識別也是個問題,畢竟無法準確分割字之間的筆跡。 我結合之前 ...
書寫識別,網上的大佬們都有輸出。
書寫識別存在的2個問題:
- 直接拿官網的案例(將 Windows Ink 筆劃識別為文本和形狀 - Windows apps | Microsoft Learn),會發現輸出準確度不高。
- 另外如果書寫過快,片語識別也是個問題,畢竟無法準確分割字之間的筆跡。
我結合之前開發經驗,整理下書寫識別比較完善的方案。
單個字的識別方案:
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 }
這裡單字識別,想要提高識別率,可以將stroke合併成一個:
1 var points = new StylusPointCollection(); 2 foreach (var stroke in strokes) 3 { 4 points.Add(new StylusPointCollection(stroke.StylusPoints)); 5 } 6 var newStroke = new StrokeCollection 7 { 8 new Stroke(points) 9 };
多字的識別方案:
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)
作者:唐宋元明清2188 出處:http://www.cnblogs.com/kybs0/ 本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須在文章頁面給出原文連接,否則保留追究法律責任的權利。