|
| 1 | +- 提案时间: 2023-11-21 |
| 2 | +- 影响版本: 1400 |
| 3 | +- 相关 Issues: 无 |
| 4 | + |
| 5 | +## 【必填】概述 |
| 6 | + |
| 7 | +光学字符识别(Optical Character Recognition, OCR)是指对文本资料的图像文件进行分析识别处理,获取文字及版面信息的过程。亦即将图像中的文字进行识别,并以文本的形式返回。 |
| 8 | + |
| 9 | +## 【必填】动机 |
| 10 | + |
| 11 | +方便开发者更便利的使用AI相关一些能力,降低开发难度,从而可以开发更丰富的快应用; |
| 12 | + |
| 13 | +## 【必填】API规格和使用案例 |
| 14 | + |
| 15 | +#### 接口声明 |
| 16 | +```javascript |
| 17 | +{ "name": "service.ai.ocr" } |
| 18 | +``` |
| 19 | + |
| 20 | +#### 导入模块 |
| 21 | +```javascript |
| 22 | +import ocr from '@service.ai.ocr' 或 const ocr = require('@service.ai.ocr') |
| 23 | +``` |
| 24 | + |
| 25 | +#### 接口定义 |
| 26 | +--- |
| 27 | +##### ocr.getProvider() |
| 28 | +检查当前设备是否支持OCR,获取服务提供商。 |
| 29 | + |
| 30 | +##### 参数: |
| 31 | +无 |
| 32 | + |
| 33 | +##### 返回值: |
| 34 | +字符串,服务提供商的代号,如厂商的英文品牌名称,假如无此服务则返回空字符串; |
| 35 | + |
| 36 | +##### 代码案例: |
| 37 | +```javascript |
| 38 | +console.log(ocr.getProvider()) |
| 39 | +``` |
| 40 | + |
| 41 | +# |
| 42 | + |
| 43 | + |
| 44 | +##### ocr.detect(object) |
| 45 | +对目标图片进行OCR识别。 |
| 46 | + |
| 47 | +##### 参数: |
| 48 | +| 参数名 | 类型 | 是否必填 | 说明 | |
| 49 | +| :----- | :---- | :--: |:---------------------------------------------------------- | |
| 50 | +| data | Object | 是 | 输入的数据资源 | |
| 51 | +| config | Object | 否 | OCR能力配置 | |
| 52 | +| success | Function | 否 | 成功回调函数 | |
| 53 | +| fail | Function | 否 | 失败回调函数 | |
| 54 | + |
| 55 | +###### 参数 - data值: |
| 56 | +| 参数名 | 类型 | 是否必填 | 说明 | |
| 57 | +| :----- | :---- | :--: |:---------------------------------------------------------- | |
| 58 | +| type | String | 是 | 输入的数据资源类型,可以为uri、rawString; | |
| 59 | +| content | String | 是 | 与type匹配的资源描述; | |
| 60 | + |
| 61 | +###### 参数 - data - type值: |
| 62 | +| type参数值 | 说明 | |
| 63 | +| :-----|:---------------------------------------------------------- | |
| 64 | +| uri | content表示数据从文件获取,提供文件的本地路径,类型为String; | |
| 65 | +| rawString | content表示数据实际内容,类型为String,表示base64类型图片; | |
| 66 | + |
| 67 | +###### 参数 - config值: |
| 68 | +| 参数名 | 类型 | 是否必填 | 说明 | |
| 69 | +| :-----: | :----: | :--: |:----------------------------------------------------------: | |
| 70 | +| mode | Number | 否 | 识别模式:0表示按行识别,1表示按段落识别,默认值为0; | |
| 71 | + |
| 72 | + |
| 73 | +##### 返回值: |
| 74 | +| 参数名 | 类型 | 是否必填 | 说明 | |
| 75 | +| :-----: | :----: | :--: |:----------------------------------------------------------: | |
| 76 | +| result | Array\<OCRResult> | 是 | 识别出的文本块; | |
| 77 | + |
| 78 | +##### 返回值 OCRResult值: |
| 79 | +| 参数名 | 类型 | 是否必填 | 说明 | |
| 80 | +| :----- | :---- | :--: |:---------------------------------------------------------- | |
| 81 | +| type | String | 是 | 识别出的数据传递方式,与入参data中的type字段定义一致,这里一般为“rawString” | |
| 82 | +| content | String | 是 | 识别出的数据描述,与入参data中的content字段含义一致,这里是识别出的文本; | |
| 83 | +| boundingBox | Number[] | 是 | 识被识别出的文本的不规则包围盒,包含偶数个浮点数,每2个浮点数表示一个包围盒上的点的坐标; | |
| 84 | + |
| 85 | +boundingBox演示: |
| 86 | + |
| 87 | + |
| 88 | + |
| 89 | +如上图,则boundingBox的值为[x1, y1, x2, y2, x3, y3, x4, y4],boundingBox中相邻的点连接表示包围盒上的一条边,且首尾相连; |
| 90 | + |
| 91 | +##### 代码案例: |
| 92 | +```javascript |
| 93 | +const uri = "internal://tmp/c2e94480-9d45-4666-bf0a-41b41782bb1f/IMG_20230905_171143.jpg" |
| 94 | +ocr.detect({ |
| 95 | + data: { |
| 96 | + type: 'uri', |
| 97 | + content: uri |
| 98 | + }, |
| 99 | + config: { |
| 100 | + mode: 0 |
| 101 | + }, |
| 102 | + success: (data) => { |
| 103 | + const texts = data.result |
| 104 | + for(const text of texts){ |
| 105 | + const {type, content, boundingBox} = text |
| 106 | + } |
| 107 | + console.log("OCR success") |
| 108 | + } |
| 109 | +}) |
| 110 | +``` |
| 111 | + |
| 112 | + |
| 113 | + |
| 114 | +## 【必填】提案人员是否愿意自行实现该功能 |
| 115 | + |
| 116 | +是:提案人员愿意在提案通过后自行实现该功能; |
| 117 | + |
| 118 | +## 详细设计 |
| 119 | + |
| 120 | +可选,请向一个熟悉 hapjs内部实现的人讲解如何在 hapjs中实现这个功能,或讲解实现这一功能需要什么步骤。 |
| 121 | + |
| 122 | +## 缺陷 |
| 123 | + |
| 124 | +我们是不是可以不做这个功能,请考虑: |
| 125 | + |
| 126 | +- 实现这个功能的投入:包括代码的复杂度、代码体积的增加、实现功能投入的人力 |
| 127 | +- 这个功能是不是不需要 hapjs提供,使用 hapjs的开发者也可以在应用层实现,甚至实现得更好 |
| 128 | +- 对 hapjs既有惯用开发习惯的影响 |
| 129 | +- 对已发布版本和现有功能的影响,以及用户进行迁移的成本 |
| 130 | +- 对其它未有代码实现的 RFC 提案的影响 |
| 131 | + |
| 132 | +## 替代选择 |
| 133 | + |
| 134 | +还有其他的方案也可以实现这个功能吗? |
| 135 | + |
| 136 | +## 适配策略 |
| 137 | + |
| 138 | +如果我们实现了这个提案,有没有什么办法可以帮助开发者更好地适应这个改动? |
0 commit comments