在 Python 中调用阿里云 OCR(Optical Character Recognition,光学字符识别)服务,通常需要使用阿里云的 SDK。OCR 服务属于阿里云“视觉智能(Vision Intelligence)”产品线的一部分,调用时需通过 API 的方式实现。
以下是一个使用阿里云 Python SDK 调用 OCR 通用文字识别接口的基本示例,适用于支持返回坐标的 OCR 接口(如通用文字识别、卡证识别等),并展示如何获取坐标信息:
✅ 前提条件
- 开通服务:确保你已经在阿里云上开通了 OCR 服务。
- 获取 AccessKey:
- 登录 阿里云控制台
- 进入【AccessKey 管理】页面,创建或获取你的
AccessKeyId
和AccessKeySecret
- 安装依赖包:
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()
中的接口名称,并查看对应文档中返回字段结构。
📚 参考文档
- OCR 官方文档:https://help.aliyun.com/product/58629.html
- Python SDK 文档:https://help.aliyun.com/document_detail/53090.html
根据你的需求,你希望在 Python 中调用阿里云的 OCR 服务,并返回识别文本的坐标信息。以下是一个简洁的 Python 模板,用于调用阿里云 OCR 服务(基于阿里云 Content Moderation SDK),并获取文本的坐标信息。模板将使用阿里云的通用文字识别接口,并确保返回的 JSON 响应中包含文本的边界框(bounding box)坐标。
前提条件
- 阿里云账户:确保你已注册阿里云账户,并开通了 Content Moderation 服务(OCR 功能包含在内)。
- AccessKey:获取你的 AccessKey ID 和 AccessKey Secret(参考阿里云文档:https://www.alibabacloud.com/help/en/ram/user-guide/create-an-accesskey-pair)。
- SDK 安装:安装阿里云 Python SDK。
- 环境: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()
代码说明
- 命名:类名为
AliyunOCRAnalyzer
,简洁且反映了阿里云 OCR 分析功能。 - 初始化:
- 使用
AcsClient
初始化阿里云客户端,需提供 AccessKey ID、AccessKey Secret 和区域 ID(默认cn-shanghai
)。
- 使用
- OCR 请求:
- 使用
ImageSyncScanRequest
提交同步 OCR 任务。 - 设置
scenes
为["ocr"]
以启用文字识别。 extras
参数中的ocr: all
表示使用通用文字识别。
- 使用
- 坐标返回:
- 响应中的
locations
字段包含每个识别文本的边界框坐标,格式通常为[{"x": x, "y": y, "width": w, "height": h}, ...]
。 - 脚本解析 JSON 响应,提取文本和坐标信息。
- 响应中的
- 错误处理:捕获可能的异常(如网络错误或权限问题),并输出错误信息。
- 依赖:
- 需要
aliyun-python-sdk-core
和aliyun-python-sdk-green
。 - 图片需通过 URL 提供(支持 HTTP/HTTPS 协议)。
- 需要
使用方法
- 配置 AccessKey:
- 替换
YOUR_ACCESS_KEY_ID
和YOUR_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']
- 替换
- 设置图片 URL:
- 将
image_url
替换为实际图片的公开 URL(例如存储在阿里云 OSS 或其他可访问的服务器上)。
- 将
- 运行脚本:
- 执行脚本后,程序将输出识别的文本及其对应的坐标信息。
示例输出
假设图片包含文本“欢迎使用阿里云”,输出可能如下:
文本: 欢迎使用阿里云
坐标: [{"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)。
扩展功能
- 本地图片支持:
- 如果图片在本地,可先上传到阿里云 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}"
- 可视化坐标:
- 使用 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)
- 使用 OpenCV 绘制文本的边界框:
- 批量处理:
- 修改
tasks
列表,添加多个图片 URL 以支持批量 OCR。
- 修改