墨迹分析概述

InkAnalysis API 为平板电脑开发人员提供强大的工具,以编程方式检查墨迹输入。 API 将墨迹分类为有意义的类别,如单词、线条、段落和绘图。

可以通过多种方式使用每个分类,包括改进手写的识别结果。

墨迹分析基础知识

本部分介绍平板电脑平台墨迹分析技术,并说明何时以及如何使用它。

InkAnalysis API 有效地结合了两种不同的但免费的技术:手写识别和布局分类。 结合这两种技术可以明显提高结果,而不是单独拍摄的部分。

手写识别是手写数字墨迹的计算分析,用于以给定语言返回基于字符的解释。 也就是说,手写识别是计算机如何“读取”一个人的手写。

墨迹分析可以进一步分解为墨迹分类和布局分析。 墨迹分类是墨迹计算划分为语义有意义的单位,如段落、线条、字词和绘图。 布局分析是墨迹输入的计算检查,用于确定墨迹在墨迹图面上的位置,以及笔划如何以空间甚至语义方式相互关联。 例如,布局分析可以告知特定墨迹是批注或标注。

识别

在 InkAnalysis API 中将识别与墨迹分析相结合的一个示例是识别结果的改进。 平板电脑手写识别引擎主要用于识别单个水平墨迹线。 但是,在记笔记时,人们倾向于编写多行,这些行不能保证与页面相对水平。 使用 InkAnalysis API 时,墨迹分析器在发送到识别器之前由墨迹分析器预处理。 分析的墨迹在识别之前转换为水平,从而提高识别结果。

识别的其他好处是通过让墨迹分析器在将墨迹发送到识别器之前更正不正确的笔划顺序信息来派生的。 此外,识别结果现在以选择性方式提供。 也就是说,开发人员可以在一次调用中快速检索单个单词、行或段落的识别结果。

墨迹分类

当然,有多种方案可以保留墨迹数据不变,而不是立即将其转换为文本。 墨迹分析也在这里提供了好处。 具体而言,InkAnalysis API 可以根据墨迹笔划或绘图来拆分墨迹笔划。 分类为写作的墨迹笔划是构成单词或字符的笔划。 所有其他笔划都是绘图。 这提供了一种访问墨迹数据、启用新用户方案的新方法。 例如,你可以实现选择,以便根据用户点击的笔划类型有所不同;如果用户点击写入笔划,则应用程序会选择撰写该单词的整个笔划集,如果用户点击绘图,则应用程序仅选择该笔划。

布局分析

有用的布局分析实际上远远超出了墨迹写入和绘图组件的相对简单的细分。

墨迹分析还包括更丰富的书写和绘图笔划细分。 作为一个非常简单的示例,请使用一个墨迹 blob,如下图所示。

two simple lines of handwriting

平台分析这些笔划后,它将返回这些笔划的树表示形式,如下图所示。 对于这个简单情况,树只包含段落、线条和单词信息,但随着墨迹文档的复杂性的增加,此树的丰富性会增加。

tree representation of root, paragraph, lines, and words

由于此信息现已分为可管理单元,因此现在可以创建更强大的功能。 例如,应用程序可以将用户点击的功能扩展到用户点击一次以选择单词的功能中,点击两次以选择整个行,并点击三次以选择整个段落。 利用分析操作返回的树结构,应用程序可以将点击区域关联回树中的笔划。 应用程序找到笔划后,可以向上走树,以确定要选择的方式和相邻的笔划。

选择整个线条是墨迹分析的优点的简单示例,但是当人们认为墨迹分析器能够检测的不同类型的分层结构时,可能性会变得很大:

  • 已排序列表和无序列表
  • 形状
  • 用文本内联编写的批注注释

功能类型因应用程序而异,具体取决于要求和可用的墨迹分析和识别引擎。

关键墨迹分析功能

InkAnalysis API 的主要功能包括以下功能:

  • 增量分析
  • 持久性
  • 数据代理
  • 和解
  • 扩展性

增量分析

最终用户使用墨迹时,通常将其视为手写。 墨迹不断受到编辑操作的影响,例如添加新墨迹、删除现有墨迹和修改墨迹属性,都以不断编辑手写的方式完成。 这些编辑操作会影响分析结果。 发生编辑时,它们通常可以隔离到特定时间点的文档部分。 例如,假设用户写入了五行墨迹。 应用程序分析墨迹的标准方法是等待用户完成所有五行墨迹(例如段落)的写入,然后同步或异步分析结果。

可以通过隔离正在写入时分析的区域来优化分析这五行的总体时间,然后仅重新分析已更改的结果部分。 分析第一行后,除非最终用户对其进行修改,否则永远不会再次识别它。 第二行的识别被视为独立的识别操作。

此增量方法适用于识别操作的行级别,但它需要在更高级别运行墨迹分析操作。 例如,由于墨迹分析器可以检测这五行墨迹 (的不同级别分类,因此它可以是列表) 的标准段落或五个项目,因此墨迹分析器的增量方法就是必须分析这些更高的结构。 也就是说,在墨迹分析器将第一行墨迹分类为线条之后,它会在将第二行分类时仔细检查它是否仍然是一行。 但是,墨迹分析器将此双重检查隔离到段落,并在分析第二段时忽略第一段,将第二段视为独立的墨迹分析器操作。 当应用程序中已存在大量墨迹时,这种增量分析方法可显著节省处理时间。

持久性

增量分析适用于 InkAnalyzer 对象的给定会话或实例。 但是,第一代平板电脑平台 API 在墨迹保存到磁盘后无法执行增量分析。 InkAnalysis API 支持将墨迹保存到磁盘,以及分析结果的持久形式。 加载墨迹时,可以加载分析结果,并且可以注入 InkAnalyzer 的新实例。 InkAnalyzer 对象的新实例随后具有相同的结果状态,现在可以接受任何修改作为现有状态的增量更改,而不是再次分析所有内容。

数据代理

许多应用程序在其应用程序中已经有某种现有文档结构;例如,图形或数据库。 InkAnalyzer 还会在 ContextNode 对象的树中以结构化形式呈现结果。 InkAnalyzer 结构和应用程序的现有结构需要以两个方向互操作:结果从 InkAnalyzer 拉取到应用程序,状态将从应用程序推送到 InkAnalyzer

如果将 InkAnalyzer 的结果拉取到应用程序的结构中,则比较简单。 应用程序将循环访问结果树,并复制 (将) 所需的所有结果片段集成到其现有数据结构中。 但是,由于许多水平应用程序需要对磁盘进行增量分析和持久性,因此问题变得双向。 状态 (过去的结果) 需要从应用程序的结构拉取并推送到 InkAnalyzer 中。

为了满足此要求, InkAnalyzer 包含一系列事件,该事件在分析操作期间在适当时间引发,以允许应用程序将数据请求代理回其现有结构。 仅针对增量操作所需的 ContextNode 对象引发这些事件。

和解

大多数应用程序希望分析后台的墨迹,以使用户界面中断保持在最低水平。 但是,如果用户更改了正在分析的墨迹 (或相邻墨迹) ,则分析后台墨迹会导致问题。 例如,如果用户在后台操作期间删除墨迹,则生成的结构将反映后台操作启动时文档的状态,而不是完成文档的状态。

为了帮助应用程序, InkAnalyzer 协调分析操作开始和结束之间的文档状态差异。 在后台运行分析时用户或应用程序所做的更改始终覆盖在后台计算的结果。 对帐后,只会报告不与文档更改冲突的结果结构的各个部分,并将冲突的笔划标记为将来的分析。 下次运行后台分析操作时,将根据新状态重新计算结果。

下图展示了此过程。 时间从上到下在关系图中以线性方式表示。

process for reconciling document state changes during the analysis operation

  1. 在 1 (t1) 时,应用程序正在从最终用户收集墨迹,包括任何类型的墨迹修改,例如添加、删除或修改。
  2. 在 t2 中,应用程序调用后台分析操作。 InkAnalyzer 确定哪些墨迹没有结果,需要仔细检查哪些墨迹。 它会复制所需的墨迹数据,以允许后台线程独立执行。
  3. 在 t3, InkAnalyzer 将用户界面线程执行返回到应用程序。 InkAnalyzer 创建第二个线程、后台分析线程,以及墨迹分析和识别引擎分析复制的墨迹数据。
  4. 当分析操作发生在第二个后台线程上时,最终用户将继续编辑文档,在 t4 和 t5 处添加和删除笔划数据。 这些编辑可能会与后台正在处理的工作冲突。
  5. 在 t6 中,后台线程已完成分析操作,结果已准备就绪。 在 InkAnalyzer 将结果传达给应用程序之前,它会运行对帐算法,以确定在计算分析操作时的用户编辑是否与结果 (t4 和 t5) 冲突。 如果检测到任何冲突,则会标记碰撞笔划以供重新分析,下次应用程序调用后台分析操作时,将发生这种情况。
  6. 最后,在 t7,检测到所有碰撞时, InkAnalyzer 会将结果呈现给应用程序。

扩展性

InkAnalysis API 允许应用程序使用新型分析引擎,从而防止应用程序重写 InkAnalysis API 的所有优势,包括对帐、数据代理、持久性和增量分析。

Microsoft.Ink

墨迹分析参考