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

设 百度API_KEY = "your-api-key"
设 百度SECRET_KEY = "your-secret-key"

当 Screen1.初始化
  设 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)

当 Web_Token.收到文本(网址, 响应码, 响应类型, 响应内容)
  设 数据 = 调用 文本.从JSON解析(响应内容)
  设 百度Token = 从字典 数据 获取 "access_token"

3. 拍照识别

当 按钮_拍照识别.被点击
  调用 Camera1.拍照()

当 Camera1.拍照完成(图片路径)
  标签_状态.文本 = "正在识别..."
  ' 读取图片并转Base64
  调用 识别图片(图片路径)

定义 识别图片(图片路径)
  ' 使用FileTools扩展读取图片为Base64
  设 Base64数据 = 调用 FileTools1.文件转Base64(图片路径)
  设 URL编码数据 = 调用 Web1.网址编码(Base64数据)
  
  设 OCR_URL = "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic?access_token=" & 百度Token
  设 请求体 = "image=" & URL编码数据
  设 Web_OCR.请求头 = ["Content-Type: application/x-www-form-urlencoded"]
  调用 Web_OCR.执行Post文本请求(OCR_URL, 请求体, "UTF-8")

当 Web_OCR.收到文本(网址, 响应码, 响应类型, 响应内容)
  设 数据 = 调用 文本.从JSON解析(响应内容)
  设 词列表 = 从字典 数据 获取 "words_result"
  
  设 全部文本 = ""
  设 i = 1
  当 i ≤ 列表长度(词列表)
    设 行 = 从字典 列表第i项(词列表) 获取 "words"
    设 全部文本 = 全部文本 & 行 & "\n"
    设 i = i + 1
  标签_识别结果.文本 = 全部文本

Google ML Kit OCR

使用扩展

ML Kit扩展提供本地(离线)文字识别,无需网络:

当 按钮_识别.被点击
  调用 Camera1.拍照()

当 Camera1.拍照完成(图片路径)
  调用 MLKitOCR1.识别文字(图片路径, "zh")  ' 中文

当 MLKitOCR1.识别完成(文字, 置信度)
  标签_结果.文本 = 文字
  标签_置信度.文本 = "置信度:" & 数学.保留小数(置信度 * 100, 1) & "%"

实战案例:名片识别

当 Camera1.拍照完成(图片路径)
  设 Base64 = 调用 FileTools1.文件转Base64(图片路径)
  ' 调用百度名片识别API
  设 URL = "https://aip.baidubce.com/rest/2.0/ocr/v1/business_card?access_token=" & 百度Token
  调用 Web_OCR.执行Post文本请求(URL, "image=" & Base64, "UTF-8")

当 Web_OCR.收到文本(网址, 响应码, 响应类型, 响应内容)
  设 数据 = 调用 文本.从JSON解析(响应内容)
  设 结果 = 从字典 数据 获取 "words_result"
  
  如果 列表长度(结果) > 0
    设 名片 = 列表第1项(结果)
    标签_姓名.文本 = 从字典 名片 获取 "NAME"  ' 可能为空
    标签_公司.文本 = 从字典 名片 获取 "COMPANY"
    标签_电话.文本 = 从字典 名片 获取 "MOBILE"
    标签_邮箱.文本 = 从字典 名片 获取 "EMAIL"

常见问题

Q1: 百度OCR返回错误码?

错误码 原因 解决
110 Access Token无效 重新获取Token
17 每日请求量超限 升级套餐或等待次日
18 QPS超限 降低请求频率
216201 图片为空 检查图片路径

Q2: 识别结果不准确?

  • 确保图片清晰、光线充足
  • 文字尽量水平(可先旋转校正)
  • 使用高分辨率图片
  • 百度云OCR精度比本地识别高

总结

方案 推荐度 适用
百度云OCR ⭐⭐⭐⭐⭐ 高精度需求
ML Kit本地 ⭐⭐⭐⭐ 离线场景
Tesseract ⭐⭐⭐ 简单场景

版权声明:MIT App Inventor 官方文档采用 CC BY-SA 4.0 授权,本文档由 ai2claw 🐝 整理。

文档反馈