GCP Cloud Vision API로 텍스트 추출(Python3.6)

소개



GCP Cloud Vision API로 이미지에서 텍스트 추출을 시도했습니다.

개발 환경


  • Windows 10
  • Anaconda
  • Python 3.6
  • OpenCV 4.4.0

  • 소개



    이미지에서 텍스트 감지 를 참고로 합니다.

    1. Cloud Console에서 프로젝트를 만듭니다.
    2. 결제가 사용 설정되어 있는지 확인합니다.
    3. Vision API를 사용하도록 설정합니다.
    4. 인증을 설정하고 JSON 파일이 PC에 다운로드됩니다.
    5. 환경 변수 GOOGLE_APPLICATION_CREDENTIALS 에 JSON 파일의 경로를 설정합니다.
    6. anaconda prompt를 열고 Python 3.6 환경을 만듭니다.
    $ conda create -n py36 python=3.6
    $ conda activate py36
    

    7. 라이브러리 설치
    $ pip install numpy
    $ pip install pillow
    $ pip install opencv-python
    $ pip install --upgrade google-cloud-vision
    

    8. 아래 코드를 실행해 봅시다.
    from google.cloud import vision
    import io
    import os
    import cv2
    import numpy as np
    from PIL import ImageFont, ImageDraw, Image
    
    def detect_text(image):
        """Detects text in the file."""
        client = vision.ImageAnnotatorClient()
    
        content = cv2.imencode(".png", image)[1].tostring()
        tmp = vision.Image(content=content)
        response = client.text_detection(image=tmp)
        texts = response.text_annotations
        if response.error.message:
            raise Exception(
                '{}\nFor more info on error messages, check: '
                'https://cloud.google.com/apis/design/errors'.format(
                    response.error.message))
        return texts
    
    filename = "338px-Atomist_quote_from_Democritus.png"
    root, ext = os.path.splitext(filename)
    image = cv2.imread(filename, cv2.IMREAD_COLOR)
    texts = detect_text(image)
    fontpath ='C:\Windows\Fonts\meiryo.ttc'
    font = ImageFont.truetype(fontpath, 10)
    image_pil = Image.fromarray(image)
    for text in texts:
        print(text.description)
        vertices = [(vertex.x, vertex.y) for vertex in text.bounding_poly.vertices]
        # cv2.putText(image, text.description, vertices[0], cv2.FONT_HERSHEY_PLAIN, 1, (255, 255, 255), 1, cv2.LINE_AA)
        # cv2.rectangle(image, vertices[0], vertices[2], (0, 255, 0))
        draw = ImageDraw.Draw(image_pil)
        w, h = draw.textsize(text.description, font = font)
        draw.text((vertices[0][0], vertices[0][1]-h), text.description, font=font, fill=(255, 255, 255, 0))
        # draw.text(vertices[0], text.description, font=font, fill=(255, 255, 255, 0))
        draw.rectangle((vertices[0], vertices[2]), outline=(0, 255, 0))
    image = np.array(image_pil)
    cv2.imshow("image", image)
    cv2.imwrite(root+"_ocr"+ext, image)
    cv2.waitKey(0)
    


    입력
    PIL
    PIL(OpenCV풍)
    OpenCV








    OpenCV라면 전각 영어(일본어)가 문자화되기 때문에 PIL을 이용해 텍스트 표시했습니다.
    수고하셨습니다.

    좋은 웹페이지 즐겨찾기