本記事について
Azure Computer Visionを用いて、OCRを実行します。
コード
import os import time from azure.cognitiveservices.vision.computervision import ComputerVisionClient from msrest.authentication import CognitiveServicesCredentials from azure.cognitiveservices.vision.computervision.models import OperationStatusCodes from azure.cognitiveservices.vision.computervision.models import ComputerVisionOcrErrorException import pprint key = os.environ["AZURE_ACCOUNT_KEY"] endpoint = os.environ["AZURE_END_POINT"] def detect_texts_from_image(image_path) -> list[str]: """ 与えられた画像ファイルパスから画像を読み込み、その画像から抽出した文字列のリストを返します。 Parameters: image_path (str): 画像ファイルのパス。読み込む画像のファイルパスを指定します。 Returns: list[str]: 画像から抽出した文字列のリスト。画像内のテキストが空の場合、空のリストを返します。 """ computervision_client = ComputerVisionClient(endpoint, CognitiveServicesCredentials(key)) local_image = open(image_path, "rb") try: recognize_results = computervision_client.read_in_stream(local_image, language="ja", raw=True) except ComputerVisionOcrErrorException as e: print("errors:", e.response) return None # 結果を取得するための操作IDを取得 operation_location_remote = recognize_results.headers["Operation-Location"] operation_id = operation_location_remote.split("/")[-1] # 結果が利用可能になるまで待つ while True: get_text_results = computervision_client.get_read_result(operation_id) if get_text_results.status not in ["notStarted", "running"]: break time.sleep(1) result_lines: list[str] = [] # テキストの出力 if get_text_results.status == OperationStatusCodes.succeeded: for text_result in get_text_results.analyze_result.read_results: for line in text_result.lines: result_lines.append(line.text) return result_lines else: print(f"OperationStatusCodesがsucceeded以外 [{get_text_results.status}]") return None image_path = "./input_images/レンタカー/レンタカー予約詳細.png" # ローカルの画像パス result_lines = detect_texts_from_image(image_path) if result_lines is not None: pprint.pprint(result_lines) # 改行を含んだ文字列のリストを作成する result_lines_with_newlines = [line + '\n' for line in result_lines] with open("./output_text/output.txt", "w", encoding="utf-8") as f: f.writelines(result_lines_with_newlines) else: print("画像から文字列取得に失敗しました。")