C# 手写识别方案整理

yizhihongxing

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

书写识别存在的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     }

看下效果图

C# 手写识别方案整理C# 手写识别方案整理

 引用的命名空间是: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/archive/2023/04/28/17361589.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# 手写识别方案整理 - Python技术站

(0)
上一篇 2023年4月28日
下一篇 2023年4月30日

相关文章

  • 深入了解c# 迭代器和列举器

    深入了解 C# 迭代器和列举器攻略 什么是迭代器和列举器 迭代器是一种访问集合中元素的方式,它不需要了解集合的内部结构。迭代器是一个对象,实现集合的 IEnumerable 接口,通过 GetEnumerator() 方法获取枚举器。 列举器是一个可枚举的对象,它通过实现 IEnumerator 接口,提供一种访问集合元素的方法。枚举器可以对集合进行前向和反…

    C# 2023年5月31日
    00
  • C#利用SharpPcap实现网络包捕获嗅探

    我们来详细讲解一下“C#利用SharpPcap实现网络包捕获嗅探”的完整攻略。 什么是SharpPcap SharpPcap是一个跨平台的开源网络抓包工具库。使用它,你可以在Windows、Linux、Mac OS X等操作系统上创建网卡列表、捕获网络流量,把抓到的网络数据包解码成协议数据单元(PDUs)。 安装SharpPcap SharpPcap依赖于W…

    C# 2023年6月1日
    00
  • 使用 CliWrap 让C#中的命令行交互(推荐)

    使用 CliWrap 是一种方便、简单,并且推荐的 C# 调用命令行工具的方式。CliWrap 提供了一个类 CliWrap.Cli,该类封装了启动外部程序和与其进行交互的逻辑。 安装 要使用 CliWrap,需要将它添加到 C# 项目中。添加的方式有以下两种: NuGet:通过 NuGet 包管理器安装 CliWrap。打开 Visual Studio,打…

    C# 2023年6月7日
    00
  • Java 异步编程实践_动力节点Java学院整理

    Java 异步编程实践_动力节点Java学院整理 为什么要使用异步编程? 在应用程序中,很多操作需要占用大量的时间,如果使用同步方式,程序会在此等待,造成系统阻塞,用户体验不佳,严重的甚至会导致系统崩溃。而使用异步编程,可以让线程不必等待IO操作,而继续执行下一步操作,提高了程序的执行效率和用户体验。 异步编程的常见方式 1. 回调函数 在异步编程中,使用回…

    C# 2023年6月6日
    00
  • WinForm调用jar包的方法分析

    WinForm是一种Windows桌面应用程序开发框架,而Java的jar包是一种Java程序打包方式。在WinForm应用程序中,我们可能需要调用Java的jar包来实现某些功能。本文将提供详解“WinForm调用jar包的方法分析”的完整攻略,包括如何将Java的jar包添加到WinForm项目中、如何在WinForm中调用Java的jar包等。 将Ja…

    C# 2023年5月15日
    00
  • 使用C#中的Flags特性

    使用C#中的Flags特性,可以为枚举类型的每个成员指定一个位掩码,以便组合多个成员的标志值。在本文中,我们将讲解如何使用Flags特性,并给出两个示例来说明其用法。 何时使用Flags特性 在需要对枚举类型中的多个成员使用二进制标志值时,就可以考虑使用Flags特性来解决。通过使用Flags特性,可以将多个成员的二进制标志值组合在一起,快速判断多个标志是否…

    C# 2023年6月3日
    00
  • 在C#使用字典存储事件示例及实现自定义事件访问器

    在C#中,我们可以使用字典作为存储事件的数据结构来方便地处理事件的订阅和触发。以下是一些实现自定义事件访问器的步骤: 1. 声明事件 首先,我们需要声明事件。事件是一种操作,它在特定条件下会被触发。在C#中,事件可以理解为委托的实例化。下面是一个声明事件的示例: public event Action<string> MyEvent; 这里声明了…

    C# 2023年5月31日
    00
  • C#插入图片到Excel表格单元格代码详解

    下面是详细讲解“C#插入图片到Excel表格单元格代码详解”的完整攻略。 简介 在使用C#处理Excel表格的过程中,插入图片是一个常见的需要,本文将讲解如何使用C#代码将图片插入到Excel表格单元格中。 准备工作 在开始之前,需要先检查电脑是否安装了Microsoft Office软件(包括Excel),还需要安装Excel程序集,以便我们可以在C#中使…

    C# 2023年6月6日
    00
合作推广
合作推广
分享本页
返回顶部