455 lines
12 KiB
Markdown
455 lines
12 KiB
Markdown
|
|
# OCR 识别接口 API 文档
|
|||
|
|
|
|||
|
|
## 接口概述
|
|||
|
|
|
|||
|
|
结婚证OCR识别接口,集成百度AI的结婚证识别能力,返回结婚证上所有主要信息的识别结果,包括识别准确度(probability)和位置信息(location)。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 接口端点
|
|||
|
|
|
|||
|
|
### 1. 图片上传接口
|
|||
|
|
|
|||
|
|
**URL:** `/marriage/ocr/upload`
|
|||
|
|
|
|||
|
|
**方法:** `POST`
|
|||
|
|
|
|||
|
|
**请求参数:**
|
|||
|
|
|
|||
|
|
| 参数名 | 类型 | 必填 | 说明 |
|
|||
|
|
|-------|------|------|------|
|
|||
|
|
| file | MultipartFile | 是 | 结婚证图片文件 |
|
|||
|
|
|
|||
|
|
**请求示例:**
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
curl -X POST \
|
|||
|
|
-F "file=@marriage_certificate.jpg" \
|
|||
|
|
http://localhost:8080/marriage/ocr/upload
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**响应示例:**
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"code": 200,
|
|||
|
|
"msg": "success",
|
|||
|
|
"data": {
|
|||
|
|
"uploadId": "a1b2c3d4e5f6g7h8"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**响应参数:**
|
|||
|
|
|
|||
|
|
| 参数名 | 类型 | 说明 |
|
|||
|
|
|-------|------|------|
|
|||
|
|
| uploadId | String | 上传文件标识,后续parse接口需要使用 |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 2. 图片解析接口
|
|||
|
|
|
|||
|
|
**URL:** `/marriage/ocr/parse`
|
|||
|
|
|
|||
|
|
**方法:** `POST`
|
|||
|
|
|
|||
|
|
**Content-Type:** `application/json`
|
|||
|
|
|
|||
|
|
**请求参数:**
|
|||
|
|
|
|||
|
|
| 参数名 | 类型 | 必填 | 说明 |
|
|||
|
|
|-------|------|------|------|
|
|||
|
|
| mobile | String | 是 | 手机号 |
|
|||
|
|
| smsCode | String | 是 | 验证码 |
|
|||
|
|
| uploadId | String | 是 | 上传文件标识(来自upload接口) |
|
|||
|
|
|
|||
|
|
**请求示例:**
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"mobile": "18888888888",
|
|||
|
|
"smsCode": "123456",
|
|||
|
|
"uploadId": "a1b2c3d4e5f6g7h8"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**响应示例:**
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"code": 200,
|
|||
|
|
"msg": "success",
|
|||
|
|
"data": {
|
|||
|
|
"raw": "{\"words_result_num\": 14, \"words_result\": {...}}",
|
|||
|
|
"words": ["王连杰", "320321199504011218", "1995年04月01日", ...],
|
|||
|
|
"parsed": {
|
|||
|
|
"husbandName": "王连杰",
|
|||
|
|
"husbandId": "320321199504011218",
|
|||
|
|
"husbandBirthDate": "1995-04-01",
|
|||
|
|
"husbandNationality": "中国",
|
|||
|
|
"husbandGender": "男",
|
|||
|
|
"wifeName": "张丹",
|
|||
|
|
"wifeId": "320321199406197047",
|
|||
|
|
"wifeBirthDate": "1994-06-19",
|
|||
|
|
"wifeNationality": "中国",
|
|||
|
|
"wifeGender": "女",
|
|||
|
|
"marriageNo": "320321201700004108",
|
|||
|
|
"certificateHolder": "王连杰",
|
|||
|
|
"registerDate": "2017-04-01"
|
|||
|
|
},
|
|||
|
|
"parsed_detailed": {
|
|||
|
|
"husbandName": {
|
|||
|
|
"word": "王连杰",
|
|||
|
|
"probability": {
|
|||
|
|
"average": 20.68798065,
|
|||
|
|
"min": 0.9106679559
|
|||
|
|
},
|
|||
|
|
"location": {
|
|||
|
|
"width": 109,
|
|||
|
|
"height": 47,
|
|||
|
|
"top": 933,
|
|||
|
|
"left": 253
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
"wifeName": {
|
|||
|
|
"word": "张丹",
|
|||
|
|
"probability": {
|
|||
|
|
"average": 19.14912224,
|
|||
|
|
"min": 0.8554975986
|
|||
|
|
},
|
|||
|
|
"location": {
|
|||
|
|
"width": 83,
|
|||
|
|
"height": 43,
|
|||
|
|
"top": 1204,
|
|||
|
|
"left": 239
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
"husbandId": {
|
|||
|
|
"word": "320321199504011218",
|
|||
|
|
"probability": {
|
|||
|
|
"average": 13.2870388,
|
|||
|
|
"min": 0.5172381401
|
|||
|
|
},
|
|||
|
|
"location": {
|
|||
|
|
"width": 341,
|
|||
|
|
"height": 68,
|
|||
|
|
"top": 1081,
|
|||
|
|
"left": 343
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
"wifeId": {
|
|||
|
|
"word": "320321199406197047",
|
|||
|
|
"probability": {
|
|||
|
|
"average": 15.98988342,
|
|||
|
|
"min": 0.6194867492
|
|||
|
|
},
|
|||
|
|
"location": {
|
|||
|
|
"width": 336,
|
|||
|
|
"height": 56,
|
|||
|
|
"top": 1351,
|
|||
|
|
"left": 326
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
"husbandBirthDate": {
|
|||
|
|
"word": "1995-04-01",
|
|||
|
|
"probability": {
|
|||
|
|
"average": 20.66628647,
|
|||
|
|
"min": 0.7240950465
|
|||
|
|
},
|
|||
|
|
"location": {
|
|||
|
|
"width": 250,
|
|||
|
|
"height": 55,
|
|||
|
|
"top": 1044,
|
|||
|
|
"left": 857
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
"wifeBirthDate": {
|
|||
|
|
"word": "1994-06-19",
|
|||
|
|
"probability": {
|
|||
|
|
"average": 25.62935066,
|
|||
|
|
"min": 0.9226108789
|
|||
|
|
},
|
|||
|
|
"location": {
|
|||
|
|
"width": 255,
|
|||
|
|
"height": 56,
|
|||
|
|
"top": 1322,
|
|||
|
|
"left": 829
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
"husbandNationality": {
|
|||
|
|
"word": "中国",
|
|||
|
|
"probability": {
|
|||
|
|
"average": 17.19703484,
|
|||
|
|
"min": 0.7144192457
|
|||
|
|
},
|
|||
|
|
"location": {
|
|||
|
|
"width": 79,
|
|||
|
|
"height": 43,
|
|||
|
|
"top": 1011,
|
|||
|
|
"left": 249
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
"wifeNationality": {
|
|||
|
|
"word": "中国",
|
|||
|
|
"probability": {
|
|||
|
|
"average": 23.41218376,
|
|||
|
|
"min": 0.9498358369
|
|||
|
|
},
|
|||
|
|
"location": {
|
|||
|
|
"width": 79,
|
|||
|
|
"height": 46,
|
|||
|
|
"top": 1264,
|
|||
|
|
"left": 242
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
"husbandGender": {
|
|||
|
|
"word": "男",
|
|||
|
|
"probability": {
|
|||
|
|
"average": 24.97878838,
|
|||
|
|
"min": 0.9302400351
|
|||
|
|
},
|
|||
|
|
"location": {
|
|||
|
|
"width": 39,
|
|||
|
|
"height": 40,
|
|||
|
|
"top": 973,
|
|||
|
|
"left": 792
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
"wifeGender": {
|
|||
|
|
"word": "女",
|
|||
|
|
"probability": {
|
|||
|
|
"average": 21.57674408,
|
|||
|
|
"min": 0.8877936602
|
|||
|
|
},
|
|||
|
|
"location": {
|
|||
|
|
"width": 42,
|
|||
|
|
"height": 42,
|
|||
|
|
"top": 1243,
|
|||
|
|
"left": 765
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
"marriageNo": {
|
|||
|
|
"word": "320321201700004108",
|
|||
|
|
"probability": {
|
|||
|
|
"average": 16.35309982,
|
|||
|
|
"min": 0.6457977891
|
|||
|
|
},
|
|||
|
|
"location": {
|
|||
|
|
"width": 363,
|
|||
|
|
"height": 44,
|
|||
|
|
"top": 650,
|
|||
|
|
"left": 272
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
"certificateHolder": {
|
|||
|
|
"word": "王连杰",
|
|||
|
|
"probability": {
|
|||
|
|
"average": 16.20750237,
|
|||
|
|
"min": 0.6932016015
|
|||
|
|
},
|
|||
|
|
"location": {
|
|||
|
|
"width": 119,
|
|||
|
|
"height": 44,
|
|||
|
|
"top": 362,
|
|||
|
|
"left": 271
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
"registerDate": {
|
|||
|
|
"word": "2017-04-01",
|
|||
|
|
"probability": {
|
|||
|
|
"average": 19.06731987,
|
|||
|
|
"min": 0.7248777151
|
|||
|
|
},
|
|||
|
|
"location": {
|
|||
|
|
"width": 354,
|
|||
|
|
"height": 42,
|
|||
|
|
"top": 511,
|
|||
|
|
"left": 272
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 响应数据说明
|
|||
|
|
|
|||
|
|
### 顶级字段
|
|||
|
|
|
|||
|
|
| 字段名 | 类型 | 说明 |
|
|||
|
|
|-------|------|------|
|
|||
|
|
| code | Integer | 错误码,200表示成功 |
|
|||
|
|
| msg | String | 错误消息或"success" |
|
|||
|
|
| data | Object | 响应数据体 |
|
|||
|
|
|
|||
|
|
### data 字段说明
|
|||
|
|
|
|||
|
|
| 字段名 | 类型 | 说明 |
|
|||
|
|
|-------|------|------|
|
|||
|
|
| raw | String | 百度OCR API原始返回结果(JSON字符串) |
|
|||
|
|
| words | Array | 识别出的所有文本内容(数组格式) |
|
|||
|
|
| parsed | Object | 简化格式的解析结果(Map<String, String>),用于向后兼容 |
|
|||
|
|
| parsed_detailed | Object | **新增** 详细格式的解析结果(Map<String, OcrFieldData>),包含probability和location |
|
|||
|
|
|
|||
|
|
### OcrFieldData 结构
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"word": "识别的文本内容",
|
|||
|
|
"probability": {
|
|||
|
|
"average": 识别准确度平均值,
|
|||
|
|
"min": 识别准确度最小值
|
|||
|
|
},
|
|||
|
|
"location": {
|
|||
|
|
"width": 文本框宽度,
|
|||
|
|
"height": 文本框高度,
|
|||
|
|
"top": 距离图片顶部的像素数,
|
|||
|
|
"left": 距离图片左侧的像素数
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 支持的字段列表
|
|||
|
|
|
|||
|
|
| 字段键 | 说明 |
|
|||
|
|
|-------|------|
|
|||
|
|
| husbandName | 男方姓名 |
|
|||
|
|
| husbandId | 男方身份证号 |
|
|||
|
|
| husbandBirthDate | 男方出生日期 |
|
|||
|
|
| husbandNationality | 男方国籍 |
|
|||
|
|
| husbandGender | 男方性别 |
|
|||
|
|
| wifeName | 女方姓名 |
|
|||
|
|
| wifeId | 女方身份证号 |
|
|||
|
|
| wifeBirthDate | 女方出生日期 |
|
|||
|
|
| wifeNationality | 女方国籍 |
|
|||
|
|
| wifeGender | 女方性别 |
|
|||
|
|
| marriageNo | 结婚证字号 |
|
|||
|
|
| certificateHolder | 持证人 |
|
|||
|
|
| registerDate | 登记日期 |
|
|||
|
|
| remark | 备注(可选) |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 错误处理
|
|||
|
|
|
|||
|
|
### 常见错误响应
|
|||
|
|
|
|||
|
|
**验证码错误:**
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"code": 400,
|
|||
|
|
"msg": "验证码错误,请重新输入!",
|
|||
|
|
"data": null
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**文件已过期:**
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"code": 400,
|
|||
|
|
"msg": "上传文件不存在或已过期,请重新上传!",
|
|||
|
|
"data": null
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**配置未设置:**
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"code": 400,
|
|||
|
|
"msg": "百度OCR配置未设置,请联系管理员!",
|
|||
|
|
"data": null
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**识别失败:**
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"code": 400,
|
|||
|
|
"msg": "识别失败,请稍后再试!",
|
|||
|
|
"data": null
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 使用场景
|
|||
|
|
|
|||
|
|
### 场景1: 获取识别结果的准确度信息
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
// 前端代码示例
|
|||
|
|
const response = await fetch('/marriage/ocr/parse', {
|
|||
|
|
method: 'POST',
|
|||
|
|
headers: { 'Content-Type': 'application/json' },
|
|||
|
|
body: JSON.stringify({
|
|||
|
|
mobile: '18888888888',
|
|||
|
|
smsCode: '123456',
|
|||
|
|
uploadId: 'xxxxx'
|
|||
|
|
})
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
const result = await response.json();
|
|||
|
|
const wifeNameData = result.data.parsed_detailed.wifeName;
|
|||
|
|
|
|||
|
|
console.log('女方姓名:', wifeNameData.word);
|
|||
|
|
console.log('平均准确度:', wifeNameData.probability.average + '%');
|
|||
|
|
console.log('最小准确度:', wifeNameData.probability.min);
|
|||
|
|
|
|||
|
|
// 根据准确度判断是否需要人工审核
|
|||
|
|
if (wifeNameData.probability.average < 50) {
|
|||
|
|
alert('识别准确度较低,请人工审核');
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 场景2: 在图片上标注识别结果位置
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
// 使用location信息在图片上绘制识别结果的位置框
|
|||
|
|
const location = result.data.parsed_detailed.husbandId.location;
|
|||
|
|
|
|||
|
|
canvas.drawRect({
|
|||
|
|
x: location.left,
|
|||
|
|
y: location.top,
|
|||
|
|
width: location.width,
|
|||
|
|
height: location.height,
|
|||
|
|
strokeStyle: 'red',
|
|||
|
|
lineWidth: 2
|
|||
|
|
});
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 场景3: 向后兼容 - 获取简化结果
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
// 仍然可以使用 parsed 字段获取简化的文本结果
|
|||
|
|
const simpleParsed = result.data.parsed;
|
|||
|
|
console.log('男方姓名:', simpleParsed.husbandName);
|
|||
|
|
console.log('女方姓名:', simpleParsed.wifeName);
|
|||
|
|
console.log('结婚证号:', simpleParsed.marriageNo);
|
|||
|
|
console.log('登记日期:', simpleParsed.registerDate);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 重要说明
|
|||
|
|
|
|||
|
|
1. **概率值范围**: 0-100,越高表示识别准确度越高
|
|||
|
|
2. **位置坐标**: 以图片左上角为原点 (0, 0),单位为像素
|
|||
|
|
3. **日期格式**: 自动转换为 "YYYY-MM-DD" 格式
|
|||
|
|
4. **证号格式**: 仅保留数字部分
|
|||
|
|
5. **文件有效期**: 上传后10分钟内有效
|
|||
|
|
6. **向后兼容**: 原有的 `parsed` 字段保持不变,可继续使用
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 集成建议
|
|||
|
|
|
|||
|
|
1. **可信度检查**: 使用 `probability.average` 判断识别质量,建议设置 60% 以上为合格
|
|||
|
|
2. **异常处理**: 对于低置信度的字段,建议提示用户进行人工审核或重新上传
|
|||
|
|
3. **性能优化**: `parsed_detailed` 字段包含完整信息,客户端可按需使用
|
|||
|
|
4. **安全性**: 敏感信息(如身份证号)应在服务端进行加密处理
|
|||
|
|
5. **日志记录**: 建议记录识别结果和概率值,用于后续模型优化和问题追溯
|
|||
|
|
|