前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C# 手写识别方案整理

C# 手写识别方案整理

作者头像
郑子铭
发布2023-08-29 11:22:22
2350
发布2023-08-29 11:22:22
举报
文章被收录于专栏:DotNet NB && CloudNative

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

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

直接拿官网的案例(将 Windows Ink 笔划识别为文本和形状 - Windows apps | Microsoft Learn),会发现输出准确度不高。另外如果书写过快,词组识别也是个问题,毕竟无法准确分割字之间的笔迹。我结合之前开发经验,整理下书写识别比较完善的方案。

单个字的识别方案

代码语言:javascript
复制
private List<string> Recognize(StrokeCollection strokes)
    {
        if (strokes == null || strokes.Count == 0)
            return null;
        // 创建识别器
        var recognizers = new Recognizers();
        var chineseRecognizer = recognizers.GetDefaultRecognizer(0x0804);
        using var recContext = chineseRecognizer.CreateRecognizerContext();
        // 根据StrokeCollection构造 Ink 类型的笔迹数据。
        using var stream = new MemoryStream();
        strokes.Save(stream);
        using var inkStorage = new Ink();
        inkStorage.Load(stream.ToArray());
        using var inkStrokes = inkStorage.Strokes;
        //设置笔画数据
        using (recContext.Strokes = inkStrokes)
        {
            //识别笔画数据
            var recognitionResult = recContext.Recognize(out var statusResult);
            // 如果识别过程中出现问题,则返回null
            return statusResult == RecognitionStatus.NoError ?
                recognitionResult.GetAlternatesFromSelection().OfType<RecognitionAlternate>().Select(i => i.ToString()).ToList() :
                null;
        }
    }

这里单字识别,想要提高识别率,可以将stroke合并成一个:

代码语言:javascript
复制
var points = new StylusPointCollection();
    foreach (var stroke in strokes)
    {
        points.Add(new StylusPointCollection(stroke.StylusPoints));
    }
    var newStroke = new StrokeCollection
    {
        new Stroke(points)
    };

多字的识别方案

代码语言:javascript
复制
public IEnumerable<string> Recognize(StrokeCollection strokes)
    {
        if (strokes == null || strokes.Count == 0)
            return null;

        using var analyzer = new InkAnalyzer();
        analyzer.AddStrokes(strokes,0x0804);
        analyzer.SetStrokesType(strokes, StrokeType.Writing);
        var status = analyzer.Analyze();
        if (status.Successful)
        {
            var alternateCollection = analyzer.GetAlternates();
            return alternateCollection.OfType<AnalysisAlternate>().Select(x => x.RecognizedString);
        }
        return null;
    }

看下效果图

环境及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。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-05-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DotNet NB 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档