Python 中调用阿里云 OCR(Optical Character Recognition,光学字符识别)服务

发布于:2025-07-15 ⋅ 阅读:(12) ⋅ 点赞:(0)

在 Python 中调用阿里云 OCR(Optical Character Recognition,光学字符识别)服务,通常需要使用阿里云的 SDK。OCR 服务属于阿里云“视觉智能(Vision Intelligence)”产品线的一部分,调用时需通过 API 的方式实现。

以下是一个使用阿里云 Python SDK 调用 OCR 通用文字识别接口的基本示例,适用于支持返回坐标的 OCR 接口(如通用文字识别、卡证识别等),并展示如何获取坐标信息:


✅ 前提条件

  1. 开通服务:确保你已经在阿里云上开通了 OCR 服务
  2. 获取 AccessKey
    • 登录 阿里云控制台
    • 进入【AccessKey 管理】页面,创建或获取你的 AccessKeyIdAccessKeySecret
  3. 安装依赖包
pip install aliyunsdkcore
pip install aliyunsdkgreen

注意:OCR 接口目前主要通过自定义调用阿里云 OpenAPI 实现,部分接口可能还在 Green 或 Vision 模块中。


🧩 示例代码(调用通用OCR识别并获取坐标)

from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest
import json

# 初始化客户端
client = AcsClient(
    '<your-access-key-id>', 
    '<your-access-key-secret>',
    'cn-shanghai'  # OCR服务所在区域,根据实际情况填写
)

def ocr_recognize(image_url):
    request = CommonRequest()
    request.set_domain('ocr.cn-shanghai.aliyuncs.com')
    request.set_version('2021-07-07')
    request.set_action_name('RecognizeGeneralText')  # 使用通用OCR接口
    request.set_method('POST')

    # 设置请求参数
    request.add_query_param('Url', image_url)  # 图片URL
    # 如果是上传图片二进制数据,可以使用 Body 参数传入 Base64 编码内容
    # request.add_body_params('ImageURL', image_url)

    response = client.do_action_with_exception(request)
    result = json.loads(response)

    return result

# 示例调用
if __name__ == '__main__':
    image_url = "https://example.com/test_image.jpg"  # 替换为你的图片URL
    result = ocr_recognize(image_url)

    if result.get("Code") == "200":
        print("识别成功!")
        for item in result["Data"]["Result"]["Elements"]:
            text = item["Text"]
            box = item["Box"]  # 获取坐标信息,格式为 [x1,y1, x2,y2, x3,y3, x4,y4]
            print(f"文字: {text}, 坐标: {box}")
    else:
        print("识别失败:", result.get("Message"))

📌 关键说明

字段 含义
Text 识别出的文字内容
Box 文字所在的矩形框坐标,格式为 [x1, y1, x2, y2, x3, y3, x4, y4],按顺时针排列

🔁 支持的OCR接口(可根据需求替换 ActionName)

接口名 描述
RecognizeGeneralText 通用文字识别(支持坐标)
RecognizeIdCard 身份证识别
RecognizeBankCard 银行卡识别
RecognizeBusinessLicense 营业执照识别
RecognizeInvoice 发票识别

你可以根据实际用途替换 set_action_name() 中的接口名称,并查看对应文档中返回字段结构。


📚 参考文档


根据你的需求,你希望在 Python 中调用阿里云的 OCR 服务,并返回识别文本的坐标信息。以下是一个简洁的 Python 模板,用于调用阿里云 OCR 服务(基于阿里云 Content Moderation SDK),并获取文本的坐标信息。模板将使用阿里云的通用文字识别接口,并确保返回的 JSON 响应中包含文本的边界框(bounding box)坐标。

前提条件

  1. 阿里云账户:确保你已注册阿里云账户,并开通了 Content Moderation 服务(OCR 功能包含在内)。
  2. AccessKey:获取你的 AccessKey ID 和 AccessKey Secret(参考阿里云文档:https://www.alibabacloud.com/help/en/ram/user-guide/create-an-accesskey-pair)。
  3. SDK 安装:安装阿里云 Python SDK。
  4. 环境:Python 3.x 环境,安装必要的依赖库。

安装依赖

运行以下命令安装阿里云 SDK:

pip install aliyun-python-sdk-core
pip install aliyun-python-sdk-green

Python 模板代码

以下是一个简洁的 Python 脚本,用于调用阿里云 OCR 服务,识别图片中的文本并返回坐标信息:

# -*- coding: utf-8 -*-
import json
import uuid
from aliyunsdkcore.client import AcsClient
from aliyunsdkgreen.request.v20180509 import ImageSyncScanRequest

class AliyunOCRAnalyzer:
    def __init__(self, access_key_id, access_key_secret, region_id="cn-shanghai"):
        """初始化阿里云 OCR 客户端"""
        self.client = AcsClient(access_key_id, access_key_secret, region_id)

    def recognize_text_with_coordinates(self, image_url):
        """调用阿里云 OCR 服务,识别图片文本并返回坐标"""
        try:
            # 创建 OCR 请求
            request = ImageSyncScanRequest()
            request.set_accept_format('JSON')
            
            # 设置任务参数
            task = {
                "dataId": str(uuid.uuid1()),
                "url": image_url,
                "extras": {
                    "ocr": "all"  # 启用通用文字识别
                }
            }
            
            # 配置请求
            request.set_content(json.dumps({"tasks": [task], "scenes": ["ocr"]}))
            
            # 发送请求并获取响应
            response = self.client.do_action_with_exception(request)
            result = json.loads(response.decode('utf-8'))
            
            # 解析 OCR 结果
            if result.get("code") == 200 and result.get("data"):
                for task_result in result["data"]:
                    if task_result.get("results"):
                        for res in task_result["results"]:
                            if res.get("scene") == "ocr" and res.get("suggestion") == "pass":
                                ocr_data = res.get("details", [])
                                for item in ocr_data:
                                    text = item.get("text", "")
                                    coordinates = item.get("locations", [])
                                    print(f"文本: {text}")
                                    print(f"坐标: {coordinates}")
                                    # 示例坐标格式: [{"x": 100, "y": 200, "width": 50, "height": 30}, ...]
            else:
                print(f"OCR 请求失败: {result.get('msg', '未知错误')}")
                
        except Exception as e:
            print(f"错误: {str(e)}")

def main():
    # 替换为你的 AccessKey 和图片 URL
    access_key_id = "YOUR_ACCESS_KEY_ID"
    access_key_secret = "YOUR_ACCESS_KEY_SECRET"
    image_url = "https://example.com/test.jpg"  # 替换为实际图片 URL
    
    # 初始化 OCR 分析器
    ocr_analyzer = AliyunOCRAnalyzer(access_key_id, access_key_secret)
    
    # 调用 OCR 并获取坐标
    ocr_analyzer.recognize_text_with_coordinates(image_url)

if __name__ == "__main__":
    main()

代码说明

  1. 命名:类名为 AliyunOCRAnalyzer,简洁且反映了阿里云 OCR 分析功能。
  2. 初始化
    • 使用 AcsClient 初始化阿里云客户端,需提供 AccessKey ID、AccessKey Secret 和区域 ID(默认 cn-shanghai)。
  3. OCR 请求
    • 使用 ImageSyncScanRequest 提交同步 OCR 任务。
    • 设置 scenes["ocr"] 以启用文字识别。
    • extras 参数中的 ocr: all 表示使用通用文字识别。
  4. 坐标返回
    • 响应中的 locations 字段包含每个识别文本的边界框坐标,格式通常为 [{"x": x, "y": y, "width": w, "height": h}, ...]
    • 脚本解析 JSON 响应,提取文本和坐标信息。
  5. 错误处理:捕获可能的异常(如网络错误或权限问题),并输出错误信息。
  6. 依赖
    • 需要 aliyun-python-sdk-corealiyun-python-sdk-green
    • 图片需通过 URL 提供(支持 HTTP/HTTPS 协议)。

使用方法

  1. 配置 AccessKey
    • 替换 YOUR_ACCESS_KEY_IDYOUR_ACCESS_KEY_SECRET 为你的阿里云 AccessKey。
    • 可通过环境变量设置以提高安全性:
      import os
      access_key_id = os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID']
      access_key_secret = os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
      
  2. 设置图片 URL
    • image_url 替换为实际图片的公开 URL(例如存储在阿里云 OSS 或其他可访问的服务器上)。
  3. 运行脚本
    • 执行脚本后,程序将输出识别的文本及其对应的坐标信息。

示例输出

假设图片包含文本“欢迎使用阿里云”,输出可能如下:

文本: 欢迎使用阿里云
坐标: [{"x": 50, "y": 100, "width": 200, "height": 40}]

注意事项

  • 服务开通:确保已开通阿里云 Content Moderation 服务(参考:https://www.alibabacloud.com/help/en/content-moderation)。
  • 图片要求
    • 支持 JPEG、PNG 等常见格式。
    • 图片大小建议小于 10MB,分辨率适中以保证识别效果。
  • 坐标格式:阿里云 OCR 返回的坐标格式可能因接口版本不同而变化,建议调试时打印完整响应(print(result))以确认字段结构。
  • 性能优化:为提高效率,建议重用 AcsClient 实例,避免重复创建。
  • 替代方案:如果需要更复杂的 OCR 功能(例如表格识别),可考虑阿里云的 Document AI 或其他 OCR 服务(如 Google Cloud Vision、Azure AI Vision)。

扩展功能

  1. 本地图片支持
    • 如果图片在本地,可先上传到阿里云 OSS(对象存储服务),获取 URL 后调用 OCR。
    • 示例上传代码(需安装 oss2 库):
      import oss2
      def upload_to_oss(file_path, bucket_name, access_key_id, access_key_secret):
          auth = oss2.Auth(access_key_id, access_key_secret)
          bucket = oss2.Bucket(auth, 'oss-cn-shanghai.aliyuncs.com', bucket_name)
          object_name = f"ocr/{os.path.basename(file_path)}"
          bucket.put_object_from_file(object_name, file_path)
          return f"https://{bucket_name}.oss-cn-shanghai.aliyuncs.com/{object_name}"
      
  2. 可视化坐标
    • 使用 OpenCV 绘制文本的边界框:
      import cv2
      import requests
      
      def draw_bounding_boxes(image_url, coordinates, output_path):
          # 下载图片
          response = requests.get(image_url)
          image_array = np.frombuffer(response.content, np.uint8)
          image = cv2.imdecode(image_array, cv2.IMREAD_COLOR)
          
          # 绘制边界框
          for coord in coordinates:
              x, y, w, h = coord["x"], coord["y"], coord["width"], coord["height"]
              cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
          
          # 保存结果
          cv2.imwrite(output_path, image)
      
  3. 批量处理
    • 修改 tasks 列表,添加多个图片 URL 以支持批量 OCR。

参考资料

  • 阿里云 OCR 文档:https://www.alibabacloud.com/help/en/content-moderation/developer-reference/ocr
  • 阿里云 Python SDK 文档:https://www.alibabacloud.com/help/en/sdk/developer-reference/python-sdk

网站公告

今日签到

点亮在社区的每一天
去签到