9.4 KiB
9.4 KiB
OCR 功能实现总结
实现完成情况
✅ 已完成全部功能需求
新增文件清单
1. DTO 类 (数据模型)
📄 OcrProbability.java
路径: com-marriage-client/src/main/java/com/jinrui/marriage/client/dto/OcrProbability.java
说明: 表示OCR识别结果的概率信息
属性:
- average: Double (平均概率)
- min: Double (最小概率)
📄 OcrLocation.java
路径: com-marriage-client/src/main/java/com/jinrui/marriage/client/dto/OcrLocation.java
说明: 表示OCR识别结果的位置信息
属性:
- width: Integer (宽度)
- height: Integer (高度)
- top: Integer (顶部距离)
- left: Integer (左侧距离)
📄 OcrFieldData.java
路径: com-marriage-client/src/main/java/com/jinrui/marriage/client/dto/OcrFieldData.java
说明: 表示单个识别字段的完整数据
属性:
- word: String (识别的文本内容)
- probability: OcrProbability (识别概率)
- location: OcrLocation (位置信息)
2. Controller 修改
📝 OcrController.java
修改内容:
1. 新增imports: OcrFieldData, OcrProbability, OcrLocation
2. 修改 /parse 端点返回值:
- 新增 parsed_detailed 字段(返回完整的字段数据)
- 保持 parsed 字段(向后兼容,仅包含文本)
3. 新增 parseMarriageFieldsFromRawDetailed() 方法
- 从百度API原始响应中提取详细字段数据
- 支持所有结婚证字段
4. 新增 extractFieldData() 方法
- 从JSON中提取完整字段数据(word + probability + location)
5. 新增 convertToSimpleParsed() 方法
- 将详细数据转换为简化格式(向后兼容)
3. 示例和文档
📄 OcrResponseExample.java
路径: com-marriage-client/src/main/java/com/jinrui/marriage/client/example/OcrResponseExample.java
说明: 演示新API的使用方式,包含6个实用示例
示例:
1. 检查识别结果的可信度
2. 获取识别结果在图片中的位置
3. 按置信度筛选结果
4. 获取完整的字段详细信息
5. 使用简化版本(向后兼容)
6. 导出为JSON格式
📄 OcrFieldDataTest.java
路径: com-marriage-client/src/test/java/com/jinrui/marriage/client/test/OcrFieldDataTest.java
说明: 单元测试文件
测试用例:
- DTO创建和初始化
- JSON序列化/反序列化
- 阈值判断
- 边界值测试
- null值处理
📄 OCR_UPDATE.md
路径: 项目根目录
说明: OCR功能更新文档
内容:
- 功能描述
- DTO类说明
- API返回格式详解
- 向后兼容性说明
- 识别字段列表
- 使用示例
- 技术实现细节
- 注意事项
📄 OCR_API_DOCUMENT.md
路径: 项目根目录
说明: 详细的API接口文档(与Swagger兼容)
内容:
- 接口概述
- 上传接口说明
- 解析接口说明
- 响应数据详细说明
- 错误处理指南
- 使用场景示例
- 集成建议
核心功能说明
功能1: 返回识别概率信息
百度API原始格式:
{
"word": "王连杰",
"probability": {
"average": 20.68798065,
"min": 0.9106679559
}
}
在API响应中:
{
"parsed_detailed": {
"husbandName": {
"word": "王连杰",
"probability": {
"average": 20.68798065,
"min": 0.9106679559
},
...
}
}
}
使用方式:
const confidence = response.data.parsed_detailed.husbandName.probability.average;
if (confidence < 60) {
// 提示用户进行人工审核
}
功能2: 返回位置信息
百度API原始格式:
{
"location": {
"width": 109,
"height": 47,
"top": 933,
"left": 253
}
}
在API响应中:
{
"parsed_detailed": {
"husbandName": {
"word": "王连杰",
"location": {
"width": 109,
"height": 47,
"top": 933,
"left": 253
},
...
}
}
}
使用方式 (前端标注):
const loc = response.data.parsed_detailed.husbandName.location;
// 在图片上绘制识别框
drawRectangle(loc.left, loc.top, loc.width, loc.height);
功能3: 向后兼容性
旧格式仍然保持:
{
"parsed": {
"husbandName": "王连杰",
"wifeName": "张丹",
"marriageNo": "320321201700004108",
"registerDate": "2017-04-01"
}
}
现有客户端代码无需修改,仍可继续使用:
const husbandName = response.data.parsed.husbandName;
支持的识别字段
| 字段键 | 说明 | 备注 |
|---|---|---|
| husbandName | 男方姓名 | ✅ |
| husbandId | 男方身份证号 | ✅ |
| husbandBirthDate | 男方出生日期 | 自动转换格式 |
| husbandNationality | 男方国籍 | ✅ |
| husbandGender | 男方性别 | ✅ |
| wifeName | 女方姓名 | ✅ |
| wifeId | 女方身份证号 | ✅ |
| wifeBirthDate | 女方出生日期 | 自动转换格式 |
| wifeNationality | 女方国籍 | ✅ |
| wifeGender | 女方性别 | ✅ |
| marriageNo | 结婚证字号 | 仅保留数字 |
| certificateHolder | 持证人 | ✅ |
| registerDate | 登记日期 | 自动转换格式 |
| remark | 备注 | 可选 |
API 响应结构
┌─ data (响应数据体)
├─ raw String 百度OCR原始响应
├─ words Array 识别的所有文本
├─ parsed Object 简化格式(向后兼容)
│ ├─ husbandName String
│ ├─ wifeName String
│ ├─ marriageNo String
│ └─ registerDate String
└─ parsed_detailed Object 详细格式(新增)
├─ husbandName OcrFieldData
│ ├─ word String
│ ├─ probability OcrProbability
│ │ ├─ average Double
│ │ └─ min Double
│ └─ location OcrLocation
│ ├─ width Integer
│ ├─ height Integer
│ ├─ top Integer
│ └─ left Integer
└─ wifeName OcrFieldData
└─ ... (结构相同)
技术亮点
-
完全向后兼容
- 旧版客户端无需修改代码
- 同时提供新旧两种格式
-
灵活的数据结构
- probability 和 location 为可选字段
- 支持 null 值处理
-
规范的命名
- 类名使用 Ocr 前缀
- 字段名与百度API保持一致
-
完整的文档
- API文档
- 实现文档
- 代码示例
- 单元测试
部署和编译
编译项目
cd /Users/bugjiewang/StudioProjects/fucai-server
mvn clean compile -DskipTests -pl com-marriage-client
单元测试
mvn test -pl com-marriage-client -Dtest=OcrFieldDataTest
打包应用
mvn clean package -DskipTests
使用建议
客户端集成步骤
- 调用上传接口
const formData = new FormData();
formData.append('file', imageFile);
const uploadResp = await fetch('/marriage/ocr/upload', {
method: 'POST',
body: formData
});
const uploadId = uploadResp.data.uploadId;
- 调用解析接口
const parseResp = await fetch('/marriage/ocr/parse', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
mobile: userMobile,
smsCode: verificationCode,
uploadId: uploadId
})
});
- 处理响应
const data = parseResp.data;
// 方式1: 使用简化格式(向后兼容)
const simplifiedData = data.parsed;
// 方式2: 使用详细格式(包含概率和位置)
const detailedData = data.parsed_detailed;
// 方式3: 检查识别质量
for (const [key, fieldData] of Object.entries(detailedData)) {
if (fieldData.probability.average < 60) {
console.warn(`${key} 识别度较低: ${fieldData.probability.average}%`);
}
}
注意事项
-
⚠️ 概率值意义
- 0-100 之间的浮点数
- 越高表示识别准确度越高
- 建议 >= 60% 为可接受
-
⚠️ 位置信息
- 坐标以图片左上角为原点
- 单位为像素
- 用于前端标注或图片裁剪
-
⚠️ 字段转换
- 日期自动转换为 YYYY-MM-DD 格式
- 证号仅保留数字部分
- 其他字段保持原样
-
⚠️ 安全性
- 敏感信息(如身份证号)建议端到端加密
- 服务端应对数据进行脱敏处理
- 仅在必要时返回完整信息
文档索引
| 文档 | 用途 | 读者 |
|---|---|---|
| OCR_UPDATE.md | 功能更新说明 | 开发者、产品经理 |
| OCR_API_DOCUMENT.md | 接口调用文档 | 前端开发者 |
| OcrResponseExample.java | 代码示例 | 开发者 |
| OcrFieldDataTest.java | 单元测试 | QA、开发者 |
总结
✅ 本次更新成功将百度API的 probability 和 location 字段集成到OCR识别结果中
- 新增3个DTO类,规范封装数据
- 修改OcrController,提供两种格式的返回值
- 新增3个方法,支持详细数据提取和格式转换
- 提供完整的文档、示例和单元测试
- 完全向后兼容,无需修改现有客户端代码
实现特点:
- 高度可用 - 支持probability和location的完整信息
- 高度兼容 - 保持原有的parsed简化格式
- 高度规范 - 遵循阿里巴巴JAVA开发规范
- 高度可靠 - 包含完整的文档、示例和测试
建议:
- 立即在QA环境测试
- 收集反馈并优化阈值
- 逐步推进到生产环境
- 监控识别准确率变化