nprogram’s blog

気ままに、プログラミングのトピックについて書いていきます

Azure Computer Visionを用いて、OCRを実行!

本記事について

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("画像から文字列取得に失敗しました。")

参考リンク