카카오 API중에 OCR API가 있다고 해서 한 번 사용해봤습니다. 캡챠문자도 인식이 가능한지 궁금해서 한 번 테스트를 해보았는데요. 역시 가공되지 않은 이미지다 보니 인식은 제대로 안되더라구요. API문서에 있는 예제코드 내용 살펴보겠습니다.
카카오 비전 API에서는 다양한 기능을 제공하고 있으니 필요한 기능을 가져다 쓸 수 있을듯 하면 한번 사용해보세요.
기능으로는 얼굴검출, 상품검출, 성인 이미지 판별, 썸너엘 생성, 썸네일 검출, 멀티 태그 생성, OCR이 있습니다.
OCR
OCR은 Optical Character Recognition 이라고 합니다. 이미지에서 문자를 판단하여 추출 한 후 텍스트 형식으로 변환시켜주는 기능합니다.
이렇게 이미지 속에 있는 문자를 인식하는 기능을 말합니다.
카카오 디벨로퍼 비전 개발문서 바로가기
주피터 노트북을 이용해서 테스트를 해보았습니다.
[공부/Python] - 파이썬 Python 아나콘다3 주피터 노트북 설정하기
import json
import cv2
import requests
import sys
LIMIT_PX = 1024
LIMIT_BYTE = 1024*1024 # 1MB
LIMIT_BOX = 40
rest_api_key = 'key'
rest_api_key는 카카오 디벨로퍼의 앱생성 후 키목록이 있습니다. rest api키를 사용하시면 됩니다.
def kakao_ocr_resize(image_path: str):
"""
ocr detect/recognize api helper
ocr api의 제약사항이 넘어서는 이미지는 요청 이전에 전처리가 필요.
pixel 제약사항 초과: resize
용량 제약사항 초과 : 다른 포맷으로 압축, 이미지 분할 등의 처리 필요. (예제에서 제공하지 않음)
:param image_path: 이미지파일 경로
:return:
"""
image = cv2.imread(image_path)
height, width, _ = image.shape
print(f"height : {height}, width : {width}")
if LIMIT_PX < height or LIMIT_PX < width:
ratio = float(LIMIT_PX) / max(height, width)
image = cv2.resize(image, None, fx=ratio, fy=ratio)
height, width, _ = height, width, _ = image.shape
# api 사용전에 이미지가 resize된 경우, recognize시 resize된 결과를 사용해야함.
image_path = "{}_resized.jpg".format(image_path)
cv2.imwrite(image_path, image)
return image_path
return None
이미지가 클 경우에 이미지를 처리하여서 리사이즈 하는 코드입니다.
def kakao_ocr(image_path: str, appkey: str):
"""
OCR api request example
:param image_path: 이미지파일 경로
:param appkey: 카카오 앱 REST API 키
"""
API_URL = 'https://dapi.kakao.com/v2/vision/text/ocr'
headers = {'Authorization': 'KakaoAK {}'.format(appkey)}
image = cv2.imread(image_path)
jpeg_image = cv2.imencode(".jpg", image)[1]
data = jpeg_image.tobytes()
return requests.post(API_URL, headers=headers, files={"image": data})
전처리한 이미지를 가지고 이미지에서 문자를 판단합니다. POST 공통사항은 카카오 디벨로퍼에 자세히 나와있습니다.
def main():
# if len(sys.argv) != 3:
# print("Please run with args: $ python example.py /path/to/image appkey")
# image_path, appkey = sys.argv[1], sys.argv[2]
image_path = 'google.png'
resize_impath = kakao_ocr_resize(image_path)
print(resize_impath)
if resize_impath is not None:
image_path = resize_impath
print("원본 대신 리사이즈된 이미지를 사용합니다.")
output = kakao_ocr(image_path, rest_api_key).json()
print("[OCR] output:\n{}\n".format(json.dumps(output, sort_keys=True, indent=2)))
sys를 사용하지 않고 직접 path를 넣어줬습니다. 캡챠이미지 원본의 경우 output 결과는 제대로 검출이 되지 않았습니다. 하지만 반듯한 문자의 경우는 제대로 인식이되었습니다. google 로고 이미지를 캡쳐해서 테스트 이미지로 사용을 해보았고 정상적인 검출이 되었습니다.
해당 이미지로 테스트를 하였습니다. 인식이 잘 될거같죠? ㅎㅎ
[OCR] output:
{
"result": [
{
"boxes": [
[
9,
38
],
[
275,
33
],
[
276,
95
],
[
9,
100
]
],
"recognition_words": [
"Google"
]
}
]
}
recognition_words로 Google이 검출된 걸 볼 수 있습니다.