App Inventor 2 OCR文字识别教程 - 百度云与本地识别方案

« 返回首页

概述

已有文档:pro/ocr.md 介绍了OCR相关方案。本文补充百度云OCR的具体实现。

方案对比

方案 精度 免费 离线 难度
百度云OCR ⭐⭐⭐⭐⭐ 有免费额度 ❌ ⭐⭐⭐
Google ML Kit ⭐⭐⭐⭐ ✅ ✅ ⭐⭐⭐
Tesseract扩展 ⭐⭐⭐ ✅ ✅ ⭐⭐

百度云OCR

1. 获取API Key

  1. 访问 https://cloud.baidu.com/doc/OCR/index.html
  2. 创建应用,获取 API Key 和 Secret Key
  3. 通用文字识别每月免费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 ⭐⭐⭐ 简单场景
文档反馈