Skip to content

Commit fef1b23

Browse files
committed
feature: add service.ai.ocr
Signed-off-by: lewiscutey <[email protected]>
1 parent 8b2eb0f commit fef1b23

File tree

1 file changed

+138
-0
lines changed

1 file changed

+138
-0
lines changed

rfcs/0000-add-ai-ocr-ability.md

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
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+
![boundingBox 图片](https://i.postimg.cc/x86TQWmH/20231121-112611.png)
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

Comments
 (0)