C#?手寫識(shí)別的實(shí)現(xiàn)示例
書寫識(shí)別,網(wǎng)上的大佬們都有輸出。
書寫識(shí)別存在的2個(gè)問題:
- 直接拿官網(wǎng)的案例(將 Windows Ink 筆劃識(shí)別為文本和形狀 - Windows apps | Microsoft Learn),會(huì)發(fā)現(xiàn)輸出準(zhǔn)確度不高。
- 另外如果書寫過快,詞組識(shí)別也是個(gè)問題,畢竟無法準(zhǔn)確分割字之間的筆跡。
我結(jié)合之前開發(fā)經(jīng)驗(yàn),整理下書寫識(shí)別比較完善的方案。
單個(gè)字的識(shí)別方案
private List<string> Recognize(StrokeCollection strokes) { if (strokes == null || strokes.Count == 0) return null; // 創(chuàng)建識(shí)別器 var recognizers = new Recognizers(); var chineseRecognizer = recognizers.GetDefaultRecognizer(0x0804); using var recContext = chineseRecognizer.CreateRecognizerContext(); // 根據(jù)StrokeCollection構(gòu)造 Ink 類型的筆跡數(shù)據(jù)。 using var stream = new MemoryStream(); strokes.Save(stream); using var inkStorage = new Ink(); inkStorage.Load(stream.ToArray()); using var inkStrokes = inkStorage.Strokes; //設(shè)置筆畫數(shù)據(jù) using (recContext.Strokes = inkStrokes) { //識(shí)別筆畫數(shù)據(jù) var recognitionResult = recContext.Recognize(out var statusResult); // 如果識(shí)別過程中出現(xiàn)問題,則返回null return statusResult == RecognitionStatus.NoError ? recognitionResult.GetAlternatesFromSelection().OfType<RecognitionAlternate>().Select(i => i.ToString()).ToList() : null; } }
這里單字識(shí)別,想要提高識(shí)別率,可以將stroke合并成一個(gè):
var points = new StylusPointCollection(); foreach (var stroke in strokes) { points.Add(new StylusPointCollection(stroke.StylusPoints)); } var newStroke = new StrokeCollection { new Stroke(points) };
多字的識(shí)別方案
public IEnumerable<string> Recognize(StrokeCollection strokes) { if (strokes == null || strokes.Count == 0) return null; using var analyzer = new InkAnalyzer(); analyzer.AddStrokes(strokes,0x0804); analyzer.SetStrokesType(strokes, StrokeType.Writing); var status = analyzer.Analyze(); if (status.Successful) { var alternateCollection = analyzer.GetAlternates(); return alternateCollection.OfType<AnalysisAlternate>().Select(x => x.RecognizedString); } return null; }
看下效果圖
環(huán)境及DLL引用
引用的命名空間是:Windows.Ink和MicroSoft.Ink,需要引用的DLL文件有四個(gè)。
- IACore.dll、IALoader.dll、IAWinFX.dll,這三個(gè)DLL文件都是Intel集成顯卡驅(qū)動(dòng)的重要組成部分,包含了圖形處理模塊,尤其是IAWinFX為WPF應(yīng)用提供了支持硬件加速的圖形渲染。
- Microsoft.Ink.dll
值得說明一下,Windows.Ink與Microsoft.Ink在平臺(tái)支持上不同,如果有要適配不同版本的windows,需要去上方代碼修改下
- Microsoft.Ink支持Windows XP、Vista 和 Win7 等舊版 Windows,兼容性高。但Win10及以上版本,官方推薦使用Windows.Ink
- Windows.Ink,則僅支持Win8以上版本
引用了上面4個(gè)DLL文件后,還有2個(gè)環(huán)境問題:
- 在App.config文件中,對(duì)節(jié)點(diǎn)startup添加屬性 useLegacyV2RuntimeActivationPolicy="true"
- 修改項(xiàng)目配置為x86
到此這篇關(guān)于C# 手寫識(shí)別的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)C# 手寫識(shí)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#實(shí)現(xiàn)將PPT轉(zhuǎn)換成HTML的方法
這篇文章主要介紹了C#實(shí)現(xiàn)將PPT轉(zhuǎn)換成HTML的方法,非常實(shí)用的功能,需要的朋友可以參考下2014-08-08C#中基數(shù)排序算法的原理及實(shí)現(xiàn)
基數(shù)排序算法是一種非比較式的排序方法,通過分配和收集步驟對(duì)數(shù)字的每一位進(jìn)行排序,學(xué)習(xí)基數(shù)排序有助于提高排序效率,解決特定問題,廣泛應(yīng)用于多個(gè)領(lǐng)域如數(shù)據(jù)分析和數(shù)據(jù)庫索引建立等2024-10-10Unity實(shí)現(xiàn)旋轉(zhuǎn)扭曲圖像特效
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)旋轉(zhuǎn)扭曲圖像特效,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02C#對(duì)Access進(jìn)行增刪改查的完整示例
本文主要是講C#對(duì)Access數(shù)據(jù)庫的增刪改查操作,想學(xué)習(xí)C#和Access數(shù)據(jù)庫操作基礎(chǔ)的可以參考借鑒,以下代碼都經(jīng)過實(shí)踐測(cè)試可用,下面跟著小編一起來看看。2016-08-08淺談c#開發(fā)者應(yīng)該了解的15個(gè)特性
本文列舉了15個(gè)值得了解的C#特性,旨在讓.NET開發(fā)人員更好的使用C#語言進(jìn)行開發(fā)工作。2021-05-05Unity UGUI教程之實(shí)現(xiàn)滑頁效果
使用UGUI提供的ScrollRect和ScrollBar組件實(shí)現(xiàn)基本滑動(dòng)以及自己控制每次移動(dòng)一頁來達(dá)到滑頁的效果。具體實(shí)現(xiàn)思路請(qǐng)參考下本教程2016-04-04秒表計(jì)時(shí)器以及STOPWATCH(實(shí)例講解)
下面小編就為大家分享一篇秒表計(jì)時(shí)器以及STOPWATCH(實(shí)例講解),具有很好的參考價(jià)值,希望對(duì)大家有所幫助2017-11-11解析C#網(wǎng)絡(luò)編程中的Http請(qǐng)求
這篇文章主要介紹了C#網(wǎng)絡(luò)編程中的Http請(qǐng)求,不過這次也使我對(duì)C#網(wǎng)絡(luò)編程了解的更多,算是一次學(xué)習(xí)經(jīng)歷吧,文章結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-03-03