- 0
- 이니스프리
- 조회 수 694
아시다시피 카카오 REST API 중에 문자영역감지 기능이 있습니다.
https://developers.kakao.com/docs/restapi/vision#%EB%AC%B8%EC%9E%90-%EC%98%81%EC%97%AD-%EA%B0%90%EC%A7%80
간단히 설명드리면 이미지를 POST로 전송하면 문자영역을 감지하여 좌표값을 반환합니다.
즉 문자영역감지 API는 좌표값만 반환하고, 이를 다시 OCR API에 넣어줘야 인식한 문자열을 반환합니다.
카카오 문자영역감지 API를 테스트하기 위해 Wavve에서 고독한 미식가 영상의 한 장면을 캡쳐했습니다 ^^
다음과 같은 스크립트를 작성하여 카카오 API를 이용하여 문자영역을 감지하고, Pillow를 이용하여 감지한 영역을 빨간색 사각형으로 표시했습니다.
processing 함수는 제가 주먹구구식으로 대충 만든 것이라서 허접합니다 ㅠㅠ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | import requests, json from PIL import Image, ImageDraw MYAPP_KEY = 'API 키를 입력하세요' def detect_area(filename): API_URL = 'https://kapi.kakao.com/v1/vision/text/detect' headers = {'Authorization': 'KakaoAK {}'.format(MYAPP_KEY)} try: files = { 'file' : open(filename, 'rb')} resp = requests.post(url=API_URL, headers=headers, files=files) resp.raise_for_status() result = resp.json()['result']['boxes'] return result except Exception as e: print(str(e)) def processing(file, box_list): im = Image.open(file) draw = ImageDraw.Draw(im) for box in box_list: for a in range(0, 4): if a <= 2: b = a + 1 else: b = 0 draw.line(box[a] + box[b], fill=128, width=5) return im file = '파일명' box_list = detect_area(file) im = processing(file, box_list) filename = ''.join(file.split('.')[:-1]) + '_detect.' + file.split('.')[-1] im.save(filename) |
완벽하지는 않지만 어느 정도 성공적이라고 볼 수 있을까요? ^-^
녹색 간판의 상단이 인식되지 않은 것을 보면, Tesseract의 일부 버전에서는 원형으로 나열된 문자열도 인식하는 옵션이 있었던 것 같은데 카카오 API는 아직 이 부분이 약한 것 같네요.
수 백개의 이미지로 테스트해봤는데요.
인식이 의외로 잘 되는 경우도 있고, 그렇지 않은 경우도 있습니다.
제가 우연히 발견한 한 가지 재미있는 점은 문자영역감지 API에서 인식이 되지 않은 이미지라도, 좌표값을 잘 넣어서 OCR API에 보내면 문자를 인식하는 경우가 적지 않더군요 ㄷㄷ
작성자
댓글 0
권한이 없습니다.