C# 手写识别方案整理

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

书写识别存在的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#网络编程中的Http请求

    解析C#网络编程中的Http请求可以分为以下几个步骤: 1. 构造HttpWebRequest对象 在C#网络编程中,我们使用HttpWebRequest对象来发起一次HTTP请求。构造HttpWebRequest对象需要指定请求的URL、请求方法等参数。下面是一个构造HttpWebRequest对象的示例代码: HttpWebRequest request…

    C# 2023年5月31日
    00
  • 在 C# 中使用 Span 和 Memory 编写高性能代码的详细步骤

    在 C# 中使用 Span<T> 和 Memory<T> 可以大幅提升代码性能,并且这两个类型被广泛地用于处理数组和内存操作。在本文中,我们将详细介绍如何使用Span<T> 和 Memory<T> 来编写高性能代码。 一、什么是 Span 和 Memory 首先,我们需要了解一下什么是 Span<T&gt…

    C# 2023年5月31日
    00
  • C#垃圾回收机制的详细介绍

    C#是一种托管式语言,这意味着它带有自己的垃圾回收机制,可以帮助程序员管理内存。以下是C#中垃圾回收机制的详细介绍: 什么是垃圾回收? 在程序执行期间,每次分配内存时,都需要在堆上分配内存,当不再使用该内存时,需要将其释放并还回给操作系统。垃圾回收是一种内存管理机制,在没有明确指定释放内存的情况下,自动释放不再使用的内存。 C#中的垃圾回收机制 C#的垃圾回…

    C# 2023年6月8日
    00
  • js 模拟实现类似c#下的hashtable的简单功能代码

    要模拟实现类似C#下的Hashtable的简单功能代码,我们可以使用JavaScript的对象和数组。以下是几个简单的步骤来实现Hashtable的简单功能。 创建Hashtable类 首先,我们需要创建一个Hashtable类,可以使用class语法糖来完成这一步。 class Hashtable { constructor() { this._map =…

    C# 2023年6月6日
    00
  • ASP.NET MVC Webuploader实现上传功能

    ASP.NET MVC是一个基于ASP.NET框架的Web应用程序开发框架,它通过模型、视图和控制器的分离,实现了高内聚低耦合、易维护易扩展的设计。Webuploader是一个基于HTML5的前端文件上传插件,支持大文件分片上传、图片压缩、进度提示等功能。本文将介绍如何使用ASP.NET MVC和Webuploader实现文件上传功能。 1. 创建ASP.N…

    C# 2023年5月15日
    00
  • asp.net 纯真ip库取得所在地实现代码

    下面我们来详细讲解如何实现“ASP.NET纯真ip库取得所在地实现代码”。 步骤一:下载纯真IP库 首先需要下载纯真IP库,可以在纯真IP数据库官网或者其他网站下载。下载完成后,解压缩得到一个.dat格式的文件。 步骤二:将IP库文件复制到项目中 将从官网上下载的IP库文件复制到项目中,推荐将此文件存放在项目下的/App_Data目录下。 步骤三:编写代码实…

    C# 2023年5月31日
    00
  • Unity3D实现旋钮控制灯光效果

    下面是Unity3D实现旋钮控制灯光效果的完整攻略。 1. 前置条件 在实现旋钮控制灯光效果之前,需要确保你已经做好了以下准备: 安装了Unity3D开发环境; 创建好了项目,并打开了场景。 2. 创建旋钮和灯光 2.1 创建旋钮 首先,我们需要创建旋钮。可以在Hierarchy面板中添加一个Canvas对象,然后在Canvas中添加一个Image和一个Sl…

    C# 2023年6月3日
    00
  • C#实现char字符数组与字符串相互转换的方法

    下面是“C#实现char字符数组与字符串相互转换的方法”的详细攻略。 转换方法 char字符数组转字符串 在C#中,可以通过以下方法将char数组转换为字符串: char[] charArray = new char[] { ‘a’, ‘b’, ‘c’ }; string str = new string(charArray); 在以上代码中,首先声明了一个…

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