« 返回首页
概述
已有文档:pro/ocr.md 介绍了OCR相关方案。本文补充百度云OCR的具体实现。
方案对比
| 方案 |
精度 |
免费 |
离线 |
难度 |
| 百度云OCR |
⭐⭐⭐⭐⭐ |
有免费额度 |
❌ |
⭐⭐⭐ |
| Google ML Kit |
⭐⭐⭐⭐ |
✅ |
✅ |
⭐⭐⭐ |
| Tesseract扩展 |
⭐⭐⭐ |
✅ |
✅ |
⭐⭐ |
百度云OCR
1. 获取API Key
- 访问 https://cloud.baidu.com/doc/OCR/index.html
- 创建应用,获取 API Key 和 Secret Key
- 通用文字识别每月免费1000次
2. 获取Access Token
global 百度API_KEY = "your-api-key"
global 百度SECRET_KEY = "your-secret-key"
when Screen1.Initialize {
var Token_URL = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials" +
"&client_id=" + 百度API_KEY +
"&client_secret=" + 百度SECRET_KEY
Web_Token.Get(Token_URL)
}
when Web_Token.GotText(网址, 响应码, 响应类型, 响应内容) {
var 数据 = Web_Token.JsonTextDecode(响应内容)
var 百度Token = 数据.get("access_token")
}
3. 拍照识别
when 按钮_拍照识别.Click {
照相机1.TakePicture()
}
when 照相机1.AfterPicture(图片路径) {
标签_状态.Text = "正在识别..."
// 读取图片并转Base64
识别图片(图片路径)
}
procedure 识别图片(图片路径) {
// 使用FileTools扩展读取图片为Base64
var Base64数据 = 文件管理器_Tools1.FileToBase64(图片路径)
var URL编码数据 = Web客户端1.UriEncode(Base64数据)
var OCR_URL = "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic?access_token=" + 百度Token
var 请求体 = "image=" + URL编码数据
Web_OCR.RequestHeaders = ["Content-Type: application/x-www-form-urlencoded"]
Web_OCR.PostText(OCR_URL, 请求体, "UTF-8")
}
when Web_OCR.GotText(网址, 响应码, 响应类型, 响应内容) {
var 数据 = Web_OCR.JsonTextDecode(响应内容)
var 词列表 = 数据.get("words_result")
var 全部文本 = ""
var i = 1
while i <= 列表长度(词列表) {
var 行项 = 列表第i项(词列表)
var 行 = 行项.get("words")
var 全部文本 = 全部文本 + 行 + "\n"
var i = i + 1
}
标签_识别结果.Text = 全部文本
}
Google ML Kit OCR
使用扩展
ML Kit扩展提供本地(离线)文字识别,无需网络:
when 按钮_识别.Click {
照相机1.TakePicture()
}
when 照相机1.AfterPicture(图片路径) {
MLKitOCR1.RecognizeText(图片路径, "zh") // 中文
}
when MLKitOCR1.GotText(文字, 置信度) {
标签_结果.Text = 文字
标签_置信度.Text = "置信度:" + 数学.保留小数(置信度 * 100, 1) + "%"
}
实战案例:名片识别
when 照相机1.AfterPicture(图片路径) {
var Base64 = 文件管理器_Tools1.FileToBase64(图片路径)
// 调用百度名片识别API
var URL = "https://aip.baidubce.com/rest/2.0/ocr/v1/business_card?access_token=" + 百度Token
Web_OCR.PostText(URL, "image=" + Base64, "UTF-8")
}
when Web_OCR.GotText(网址, 响应码, 响应类型, 响应内容) {
var 数据 = Web_OCR.JsonTextDecode(响应内容)
var 结果 = 数据.get("words_result")
if 列表长度(结果) > 0 {
var 名片 = 列表第1项(结果)
标签_姓名.Text = 名片.get("NAME") // 可能为空
标签_公司.Text = 名片.get("COMPANY")
标签_电话.Text = 名片.get("MOBILE")
标签_邮箱.Text = 名片.get("EMAIL")
}
}
常见问题
Q1: 百度OCR返回错误码?
| 错误码 |
原因 |
解决 |
| 110 |
Access Token无效 |
重新获取Token |
| 17 |
每日请求量超限 |
升级套餐或等待次日 |
| 18 |
QPS超限 |
降低请求频率 |
| 216201 |
图片为空 |
检查图片路径 |
Q2: 识别结果不准确?
- 确保图片清晰、光线充足
- 文字尽量水平(可先旋转校正)
- 使用高分辨率图片
- 百度云OCR精度比本地识别高
总结
| 方案 |
推荐度 |
适用 |
| 百度云OCR |
⭐⭐⭐⭐⭐ |
高精度需求 |
| ML Kit本地 |
⭐⭐⭐⭐ |
离线场景 |
| Tesseract |
⭐⭐⭐ |
简单场景 |