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# IFF图形结构解析代码

    下面我将为您详细讲解“C# IFF图形结构解析代码”的完整攻略,包括基本概念、示例代码和应用方法。 什么是IFF图形结构? IFF全称为Interchange File Format,是一种通用的文件格式,广泛用于图像、声音、动画、视频等文件的交换和存储。IFF格式的文件通常由块(Chunk)构成,每个块由标识、长度和数据三部分组成。其中标识(FOURCC)…

    C# 2023年6月1日
    00
  • C#正则表达式实用大全(建议收藏!)

    C#正则表达式实用大全(建议收藏!) 什么是正则表达式? 正则表达式是一种文本模式,通常被用来检索、替换那些符合某个模式的文本。在C#中,我们可以使用正则表达式来进行字符串匹配、查找和替换等操作。 正则表达式的语法 在C#中,正则表达式语法使用的是Perl风格的语法,它包含了很多元字符和修饰符,可以用来匹配常见的文本模式。下面是一些常用的正则表达式元字符: …

    C# 2023年6月1日
    00
  • Android编程实现google消息通知功能示例

    这里是关于“Android编程实现google消息通知功能示例”的完整攻略。 什么是Google消息通知功能? Google消息通知是Android系统提供的一种通知机制,通过它可以在屏幕上显示异步事件的消息提醒。这些消息会在事件发生时,通过通知栏等界面进行展示,从而让用户更方便快捷地查看和处理各种消息。 Google消息通知功能实现步骤 在Android中…

    C# 2023年6月6日
    00
  • ADO.NET数据库访问技术

    ADO.NET是Microsoft .NET Framework中提供的用于访问数据源的技术,可以用于访问关系型数据库(如SQL Server、MySQL等)和非关系型数据库(如XML)。下面将详细讲解ADO.NET的使用攻略。 准备工作 首先,需要在项目中添加对System.Data.dll程序集的引用,这个程序集包含了与ADO.NET有关的一些命名空间(…

    C# 2023年5月31日
    00
  • C#直线的最小二乘法线性回归运算实例

    C#直线的最小二乘法线性回归运算实例攻略 简介 在数据分析和模型建立过程中,直线的最小二乘法线性回归是一个比较常见的算法。在C#中,我们可以使用MathNet库来进行这个运算。 步骤 第一步:安装MathNet库 我们可以在Visual Studio的Nuget包管理器里搜索MathNet库,并安装依赖。 第二步:引入命名空间 在代码文件的头部,我们需要引入…

    C# 2023年6月8日
    00
  • .NET/C#如何判断某个类是否是泛型类型或泛型接口的子类型详解

    要判断一个类是否为泛型类型或泛型接口的子类型,可以使用反射来实现。在使用反射之前,需要了解一些相关概念。 什么是泛型类型?泛型类型是可以接受一个或多个类型参数的类型。例如,List、Dictionary 都是泛型类型。 什么是泛型接口?泛型接口是一个带有一个或多个类型参数的接口。例如,IEnumerable、IList 都是泛型接口。 以下是使用C#代码来判…

    C# 2023年6月6日
    00
  • Go遍历struct,map,slice的实现

    首先,可以通过for-range语句遍历切片和映射。for-range语句让代码更清晰易懂。 遍历slice 下面是遍历slice的示例: package main import "fmt" func main() { // 声明一个字符串切片 fruits := []string{"apple", "ban…

    C# 2023年5月31日
    00
  • 如何搭建新的WPF项目框架

    如何搭建新的WPF项目框架 搭建新的WPF项目框架可以帮助我们更好地组织和管理WPF应用程序的代码。本文将提供详细的“如何搭建新的WPF项目框架”的完整攻略,包括如何创建项目结构、如何添加基础类以及两个示例。 创建项目结构 要创建新的WPF项目框架,我们需要执行以下步骤: 创建一个新的WPF应用程序项目。 在项目中创建一个名为“Infrastructure”…

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