-
C# 手写识别方案整理
书写识别,网上的大佬们都有输出。
书写识别存在的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 }
看下效果图
环境及DLL引用
引用的命名空间是:Windows.Ink和MicroSoft.Ink,需要引用的DLL文件有四个。可点击下载:InkRecognizeDependencies.rar
- 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以上版本
引用了上面4个DLL文件后,还有2个环境问题:
- 在App.config文件中,对节点startup添加属性 useLegacyV2RuntimeActivationPolicy="true"
- 修改项目配置为x86
出处:https://www.cnblogs.com/kybs0/p/17361589.html
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
关于JS定时器的整理
JS中使用Promise.all控制所有的异步请求都完
js中字符串的方法
import-local执行流程与node模块路径解析流程
检测数据类型的四种方法
js中数组的方法,32种方法
前端操作方法
数据类型
window.localStorage.setItem 和 localStorage.setIte
如何完美解决前端数字计算精度丢失与数