涂鸦工作室#2

感兴趣的评论:

 如果(您只想知道手写识别的工作原理){
     //继续阅读
    打破
 }其他{
     //先看一下系列的第一部分
     https://medium.com/@codeprincess/the-doodling-workshop-1-ae955e351f7b
 } 

20多年前,当我有了第一台文档扫描仪时,它附带了许多不同的应用程序。 其中之一将“读取”扫描的文档并将文本提取到txt.file中。 这行得通……是的,我们可以识别一些文本。

到目前为止,可以将打印的文本识别视为已解决的问题。 可以轻松识别大多数常用字体,因此,到目前为止,对图像或图像中的文档进行文本提取非常有用。

书面文本面临的挑战甚至没有解决。 有很多不同的笔迹样式和口味。 如此多的人实际上声称在那里他们可以从某人的笔迹中读取某人的性格。

到目前为止,几个OS都有自己的基本手写识别功能。 iOS 11取得了巨大进步,例如在Notes应用程序中,您的笔迹立即“翻译”为文本。 当您处于平板电脑模式且未连接键盘时,Windows 10能够执行手写文本识别。 因此,“更多的个人计算”领域正在发生很多事情,以使人类更轻松,更自然地输入机器。 除了语音手写之外,手写书写也是其中之一。

Microsoft认知服务-手写识别

我现在在认知服务的不同领域工作了一年多,最近在计算机视觉分支:手写识别中偶然发现了一个相当新的未知API。

在使用Apple Pencil运行我的第一个自己的涂鸦应用程序之后,我想看看是否有可能在自己的应用程序中编写“即时手写识别”的代码,就像Apple在Notes应用程序中展示的那样。

首先,我必须了解如何使用API​​,因为有一个OCR调用,一个手写调用和另一个用于结果的调用。

最好的方法是通过识别文本API使用手写检测。

  https:// [location] .api.cognitive.microsoft.com / vision / v1.0 / recognizeText [?handwriting] 

这是一个POST请求,仅需要两条信息:

  • 图像作为八位字节流或附加到正文Web链接
  • 可选的 URL参数“ handwriting = true / false” 。 默认情况下将其设置为true,但是如果将其设置为false,它将在后台调用标准OCR API。 如果您同时使用API​​来手写图像和图像中的打印文本,则这是一个很好的选择。

由于文本识别可能需要一段时间,因此API返回带有附加URL的Operation-Location字段。 使用此URL,我们调用另一个称为textOperations的 API并请求结果。 该URL已经填充了有关位置operationID的必要信息,因此我们可以将其直接用作获取结果的GET请求。

  https:// [location] .api.cognitive.microsoft.com / vision / v1.0 / textOperations / {operationId} 

如果识别已经完成处理,则调用将返回成功 状态 (其他状态未启动,正在运行,失败)和图像的识别文本(如果未检测到则为空数组)。

基本上就是全部。 检索结果后,我们将其显示给用户。

进入编码

我实现的工作流程如下:

  • 启动计时器并跟踪用户是否用铅笔绘图
  • 跟踪当前书写的最小和最大x和y坐标
  • 如果用户暂停了1秒钟以上,我们认为编写已完成
  • 然后,在当前图形周围绘制一个矩形,并将该区域粘贴到新图像中
  • 此新图像被发送到认知服务手写识别呼叫
  • 从呼叫响应获取操作位置后,我们等待两秒钟
  • 然后我们执行结果调用以获取操作的结果
  • 如果识别的文本不为空,则将其显示在手写矩形的正下方。 否则,我们仅使用“无法识别文本”内容

听起来很多,但事实并非如此。 让我们从……开始

手写计时器和最小/最大坐标跟踪

首先,我们启动一个计时器,以能够跟踪用户当前在哪里绘图。 对于每次生成的触摸,我们计算当前坐标的最小值和最大值,以便稍后能够在该区域周围绘制一个矩形。

一旦用户停止绘图一秒钟以上, 就会调用drawDoodlingRect方法,并使用较早的计算出的最小/最大值。

请注意,每次循环结束时都会创建一个新的上下文。 因此,只要在涂鸦周围画出矩形框,就会调用API进行识别。 并且我们已经为下一张图纸准备了画布。

drawDoodleRect(context)现在在当前绘制区域周围创建矩形,并将其绘制在当前图像上下文上。 这是完成整个绘图的上下文。

所以resetDoodleRect()函数正在启动一个新上下文,而drawDoodlingRect(context)正在完成它。 这个循环一遍又一遍地重复。

drawTextRect(context,rect)函数只是在涂鸦矩形的正下方绘制一个矩形,以便以后显示可识别的文本—如果API调用返回了任何内容🙂

因此,这就是用户界面方面的一切。 不,让我们看一下最后丢失的那一块……

数据和REST API调用处理

首先,我们调用手写识别API,并将图像作为八位字节流附加到主体。 然后,我们从响应中获取操作位置 ,并将其用作下一个请求的URL,该请求将获取图像的已识别文本。

如上所述,这两个调用是必需的,因为识别可能需要更长的时间。 届时,请求的调用方可能已经超时。

那么通话本身看起来如何? 这里没有魔术,只有简单的REST API调用。 并且因为retrieveResultsForOcrOperation非常简单,所以我只向您展示一些更复杂的图像识别方法。

如果这对您来说没有那么多见识,请查看完整的实现,可以在游乐场回购库中的GitHub上找到它。 开箱即用的所有相关代码都位于此处。

codePrincess /游乐场

游乐场–使用iPad的Swift Playgrounds Hands

github.com

如果您喜欢准备安装的iOS应用而不是Playground,可以在此处获取源代码。

代码公主/涂鸦识别

doodlingRecognition –一个快速且不错的示例应用程序,如何实现涂鸦和手写文本识别

github.com

……但是关键!

尝试运行代码后,您可能已经注意到,API调用未正确调用。 原因是:您需要能够使用Cognitive Services计算机视觉API的密钥。 但是不用担心。 您将立即生成一个,而且还可以免费试用。

只需访问此处的入门页面,并在生成API密钥后立即将其添加到Cognitive Services.swift文件中的 69行 ,或者在将Ocp-Apim-Subscription-Key字段添加到您的实现中时,将其添加到您自己的实现中即可请求标头。

现在,您应该可以轻松手写书法!
https://medium.com/@codeprincess/the-doodling-workshop-3-70d8e360956a