经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C# » 查看文章
C# 手写识别方案整理
来源:cnblogs  作者:唐宋元明清2188  时间:2023/4/28 11:35:46  对本文有异议

书写识别,网上的大佬们都有输出。

书写识别存在的2个问题:

  1. 直接拿官网的案例(将 Windows Ink 笔划识别为文本和形状 - Windows apps | Microsoft Learn),会发现输出准确度不高。
  2. 另外如果书写过快,词组识别也是个问题,毕竟无法准确分割字之间的笔迹。

我结合之前开发经验,整理下书写识别比较完善的方案。

单个字的识别方案:

  1. 1 private List<string> Recognize(StrokeCollection strokes)
  2. 2 {
  3. 3 if (strokes == null || strokes.Count == 0)
  4. 4 return null;
  5. 5 // 创建识别器
  6. 6 var recognizers = new Recognizers();
  7. 7 var chineseRecognizer = recognizers.GetDefaultRecognizer(0x0804);
  8. 8 using var recContext = chineseRecognizer.CreateRecognizerContext();
  9. 9 // 根据StrokeCollection构造 Ink 类型的笔迹数据。
  10. 10 using var stream = new MemoryStream();
  11. 11 strokes.Save(stream);
  12. 12 using var inkStorage = new Ink();
  13. 13 inkStorage.Load(stream.ToArray());
  14. 14 using var inkStrokes = inkStorage.Strokes;
  15. 15 //设置笔画数据
  16. 16 using (recContext.Strokes = inkStrokes)
  17. 17 {
  18. 18 //识别笔画数据
  19. 19 var recognitionResult = recContext.Recognize(out var statusResult);
  20. 20 // 如果识别过程中出现问题,则返回null
  21. 21 return statusResult == RecognitionStatus.NoError ?
  22. 22 recognitionResult.GetAlternatesFromSelection().OfType<RecognitionAlternate>().Select(i => i.ToString()).ToList() :
  23. 23 null;
  24. 24 }
  25. 25 }

多字的识别方案:

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

原文链接:https://www.cnblogs.com/kybs0/p/17361589.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号