在 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" # 替換為你的圖片URLresult = 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 ImageSyncScanRequestclass 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 和圖片 URLaccess_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 requestsdef 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。
- 修改