From fef1b237e1096123d1e52c067632c17e26f3c7e5 Mon Sep 17 00:00:00 2001 From: lewiscutey <949124363@qq.com> Date: Tue, 21 Nov 2023 11:33:22 +0800 Subject: [PATCH] feature: add service.ai.ocr Signed-off-by: lewiscutey <949124363@qq.com> --- rfcs/0000-add-ai-ocr-ability.md | 138 ++++++++++++++++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 rfcs/0000-add-ai-ocr-ability.md diff --git a/rfcs/0000-add-ai-ocr-ability.md b/rfcs/0000-add-ai-ocr-ability.md new file mode 100644 index 0000000..210da62 --- /dev/null +++ b/rfcs/0000-add-ai-ocr-ability.md @@ -0,0 +1,138 @@ +- 提案时间: 2023-11-21 +- 影响版本: 1400 +- 相关 Issues: 无 + +## 【必填】概述 + +光学字符识别(Optical Character Recognition, OCR)是指对文本资料的图像文件进行分析识别处理,获取文字及版面信息的过程。亦即将图像中的文字进行识别,并以文本的形式返回。 + +## 【必填】动机 + +方便开发者更便利的使用AI相关一些能力,降低开发难度,从而可以开发更丰富的快应用; + +## 【必填】API规格和使用案例 + +#### 接口声明 +```javascript +{ "name": "service.ai.ocr" } +``` + +#### 导入模块 +```javascript +import ocr from '@service.ai.ocr' 或 const ocr = require('@service.ai.ocr') +``` + +#### 接口定义 +--- +##### ocr.getProvider() +检查当前设备是否支持OCR,获取服务提供商。 + +##### 参数: +无 + +##### 返回值: +字符串,服务提供商的代号,如厂商的英文品牌名称,假如无此服务则返回空字符串; + +##### 代码案例: +```javascript +console.log(ocr.getProvider()) +``` + +# + + +##### ocr.detect(object) +对目标图片进行OCR识别。 + +##### 参数: +| 参数名 | 类型 | 是否必填 | 说明 | +| :----- | :---- | :--: |:---------------------------------------------------------- | +| data | Object | 是 | 输入的数据资源 | +| config | Object | 否 | OCR能力配置 | +| success | Function | 否 | 成功回调函数 | +| fail | Function | 否 | 失败回调函数 | + +###### 参数 - data值: +| 参数名 | 类型 | 是否必填 | 说明 | +| :----- | :---- | :--: |:---------------------------------------------------------- | +| type | String | 是 | 输入的数据资源类型,可以为uri、rawString; | +| content | String | 是 | 与type匹配的资源描述; | + +###### 参数 - data - type值: +| type参数值 | 说明 | +| :-----|:---------------------------------------------------------- | +| uri | content表示数据从文件获取,提供文件的本地路径,类型为String; | +| rawString | content表示数据实际内容,类型为String,表示base64类型图片; | + +###### 参数 - config值: +| 参数名 | 类型 | 是否必填 | 说明 | +| :-----: | :----: | :--: |:----------------------------------------------------------: | +| mode | Number | 否 | 识别模式:0表示按行识别,1表示按段落识别,默认值为0; | + + +##### 返回值: +| 参数名 | 类型 | 是否必填 | 说明 | +| :-----: | :----: | :--: |:----------------------------------------------------------: | +| result | Array\ | 是 | 识别出的文本块; | + +##### 返回值 OCRResult值: +| 参数名 | 类型 | 是否必填 | 说明 | +| :----- | :---- | :--: |:---------------------------------------------------------- | +| type | String | 是 | 识别出的数据传递方式,与入参data中的type字段定义一致,这里一般为“rawString” | +| content | String | 是 | 识别出的数据描述,与入参data中的content字段含义一致,这里是识别出的文本; | +| boundingBox | Number[] | 是 | 识被识别出的文本的不规则包围盒,包含偶数个浮点数,每2个浮点数表示一个包围盒上的点的坐标; | + +boundingBox演示: + +![boundingBox 图片](https://i.postimg.cc/x86TQWmH/20231121-112611.png) + +如上图,则boundingBox的值为[x1, y1, x2, y2, x3, y3, x4, y4],boundingBox中相邻的点连接表示包围盒上的一条边,且首尾相连; + +##### 代码案例: +```javascript +const uri = "internal://tmp/c2e94480-9d45-4666-bf0a-41b41782bb1f/IMG_20230905_171143.jpg" +ocr.detect({ + data: { + type: 'uri', + content: uri + }, + config: { + mode: 0 + }, + success: (data) => { + const texts = data.result + for(const text of texts){ + const {type, content, boundingBox} = text + } + console.log("OCR success") + } +}) +``` + + + +## 【必填】提案人员是否愿意自行实现该功能 + +是:提案人员愿意在提案通过后自行实现该功能; + +## 详细设计 + +可选,请向一个熟悉 hapjs内部实现的人讲解如何在 hapjs中实现这个功能,或讲解实现这一功能需要什么步骤。 + +## 缺陷 + +我们是不是可以不做这个功能,请考虑: + +- 实现这个功能的投入:包括代码的复杂度、代码体积的增加、实现功能投入的人力 +- 这个功能是不是不需要 hapjs提供,使用 hapjs的开发者也可以在应用层实现,甚至实现得更好 +- 对 hapjs既有惯用开发习惯的影响 +- 对已发布版本和现有功能的影响,以及用户进行迁移的成本 +- 对其它未有代码实现的 RFC 提案的影响 + +## 替代选择 + +还有其他的方案也可以实现这个功能吗? + +## 适配策略 + +如果我们实现了这个提案,有没有什么办法可以帮助开发者更好地适应这个改动? \ No newline at end of file