앱에서의 텍스트 인식 — 정의, OCR 및 Vision

저자: IT Sectr 게시일: 2026-07-18 읽는 시간: 10 분

텍스트 인식(OCR — 광학 문자 인식)은 이미지와 비디오 스트림에서 인쇄되거나 손으로 쓴 텍스트를 추출하는 기술입니다. 모바일 개발에서 텍스트 인식은 문서 디지털화, 번호판 인식, 명함 읽기, 실시간 텍스트 번역에 사용됩니다. 주요 모바일 OCR 솔루션은 ML Kit Text Recognition(Google), Vision Framework(Apple), Tesseract OCR(오픈소스)입니다. Google ML Kit, 2025에 따르면, Text Recognition V2는 10~30ms에 프레임을 처리하며 라틴 문자에서 96%, 키릴 문자에서 91%의 정확도를 보입니다.

핵심 포인트

  • 텍스트 인식 — 이미지와 비디오에서 텍스트 추출(OCR)
  • ML Kit Text Recognition — 45개 이상 언어, 정확도 96%(라틴), 10~30ms
  • Apple Vision — VNRecognizeTextRequest, 13개 이상 언어, 네이티브 iOS
  • Tesseract — 오픈소스 OCR, 100개 이상 언어, 50~200ms, CPU
  • 실시간 — 최신 기기에서 CameraX/AVFoundation으로 최대 30FPS

텍스트 인식이란: OCR 원리

텍스트 인식(OCR)은 텍스트 이미지를 기계가 읽을 수 있는 문자로 변환하는 컴퓨터 비전 프로세스입니다. OCR은 이미지 전처리(이진화, 데스큐, 기울기 보정), 세분화(줄, 단어, 문자로 분할), 인식(각 문자 분류), 후처리(사전 확인, 오류 수정) 단계로 구성됩니다. 최신 OCR 시스템(ML Kit, Vision)은 모든 단계를 결합한 엔드투엔드 신경망을 사용합니다.

OCR 유형: 인쇄 텍스트 — 문서, 간판, 화면에서 타자된 텍스트 인식 — 정확도 95~99%; 필기 텍스트 — 손글씨 입력 인식 — 라틴 문자 80~90%, 키릴 문자 70~80% 정확도; 장면 텍스트 — 자연 장면의 텍스트: 집 번호, 도로 표지판, 상점 이름 — 원근 왜곡과 반사 때문에 가장 어려움.

CRNN + CTC Loss — 최신 OCR 모델에 사용되는 아키텍처입니다. 합성곱 순환 신경망(CNN + LSTM)이 이미지 특징을 추출하고, Connectionist Temporal Classification이 사전 세분화 없이 문자 시퀀스를 디코딩합니다. CRNN은 모든 길이의 텍스트에서 작동하며 기울기와 왜곡에 강합니다. arXiv(2025)에 따르면, CRNN 모델은 ICDAR 2019 벤치마크에서 97.5%의 정확도를 달성합니다.

OCR 솔루션정확도속도언어플랫폼
ML Kit V296%10~30ms45+Android, iOS
Apple Vision95%10~40ms13+iOS, macOS
Tesseract 590%50~200ms100+크로스 플랫폼
Google Cloud Vision98%500~1000ms200+서버(API)

모바일 기기용 CRNN — ML Kit는 INT8 양자화를 적용한 MobileNetV2 + CRNN 모델을 사용합니다. 모델 크기는 2~5MB(잠재)이며 TFLite Delegate를 통해 GPU/NPU에서 실행됩니다. Tesseract(클래식 파이프라인)와 달리, 신경망 OCR은 별도의 문자 세분화가 필요 없고 노이즈에 더 강합니다. 단점: 실시간 처리를 위해 GPU나 NPU가 필요 — 순수 CPU에서는 속도가 5~10FPS로 떨어집니다.

Android 및 iOS의 ML Kit Text Recognition

ML Kit Text Recognition은 모바일 애플리케이션을 위한 주요 OCR 도구입니다. V2(라틴 문자 기반 — 라틴, 키릴, 숫자에 최적화)와 V1(라틴 + CJK — 일본어, 중국어, 한국어 지원하지만 느림) 두 가지 버전으로 제공됩니다. V2는 엔드투엔드 CRNN 모델을 사용하고, V1은 이전 CNN + LSTM을 사용합니다. Google은 CJK 인식이 필요하지 않은 모든 경우에 V2를 권장합니다.

ML Kit 결과 구조: Text → TextBlock → Line → Element(Word/Symbol). 각 수준에는 바운딩 박스, 신뢰도(0..1) 및 인식된 텍스트가 있습니다. Text는 fullText(모든 인식된 텍스트를 한 줄로)를 가진 루트 객체입니다. TextBlock은 논리적 텍스트 블록(문단, 열)입니다. Line은 텍스트 줄입니다. Element는 단어 또는 기호입니다. 부정확한 인식을 필터링하려면 confidence를 사용하세요.

kotlin
// ML Kit Text Recognition V2
val recognizer = TextRecognition.getClient(
    TextRecognizerOptions.DEFAULT_OPTIONS
)

recognizer.process(inputImage)
    .addOnSuccessListener { text ->
        val fullText = text.text
        text.textBlocks.forEach { block ->
            val blockText = block.text
            val blockRect = block.boundingBox
            block.lines.forEach { line ->
                line.elements.forEach { element ->
                    val word = element.text
                    val confidence = element.confidence
                }
            }
        }
    }
    .addOnFailureListener { error -> /* error */ }

iOS의 텍스트 인식(ML Kit 통해): API는 Android와 유사하지만 InputImage 대신 UIImage/CVPixelBuffer를 사용합니다. ML Kit는 Core ML Delegate를 통해 A12+의 Apple Neural Engine을 자동으로 사용합니다. iOS에서 ML Kit Text Recognition V2는 iPhone 15 Pro에서 15~30ms의 속도를 보입니다. 최대 성능을 위해 전달하기 전에 UIImage를 CVPixelBuffer로 변환하세요 — 변환 오버헤드가 줄어듭니다.

Apple Vision Framework: VNRecognizeTextRequest

Apple Vision Framework는 VNRecognizeTextRequest(iOS 13+)를 통해 네이티브 OCR을 제공합니다. Vision OCR은 Apple Neural Engine(ANE)을 사용하며 추가 SDK가 필요하지 않습니다. 13개 언어(EN, FR, IT, DE, ES, PT, ZH, JP, KO, RU, AR, TH, VI)를 지원합니다. Vision은 텍스트의 언어를 자동 감지하고(언어 보정) 단일 프레임에서 여러 언어를 지원합니다. 속도 — A16+에서 10~40ms.

Vision OCR 기능: recognitionLevel(빠름 vs 정확), automaticLanguageDetection, customWords(특정 용어 추가), supportsTop candidates(흐릿한 텍스트에 대한 여러 인식 변형). 빠른 모드는 10~20ms에서 90% 정확도, 정확 모드는 30~50ms에서 95% 정확도를 제공합니다. 프로덕션에서는 confidence >= 0.5로 필터링하면서 정확 모드를 사용하세요.

swift
import Vision

let request = VNRecognizeTextRequest { request, error in
    guard let observations = request.results as? [VNRecognizedTextObservation] else { return }
    for observation in observations {
        let topCandidate = observation.topCandidates(1).first
        let text = topCandidate?.string ?? ""
        let confidence = topCandidate?.confidence ?? 0
        let boundingBox = observation.boundingBox
    }
}
request.recognitionLevel = .accurate
request.usesLanguageCorrection = true

let handler = VNImageRequestHandler(cgImage: cgImage, orientation: .up)
try handler.perform([request])

iOS에서 Vision vs ML Kit: Vision은 내장 ANE 덕분에 구형 기기(iPhone X~13)에서 더 빠릅니다. ML Kit는 수백만 개의 장면 텍스트 이미지로 학습된 Google 모델 덕분에 복잡한 장면(왜곡, 기울기, 반사)에서 더 정확합니다. Vision은 개별 문자에 대한 confidence를 지원하지 않으며(단어만), 필터링이 제한됩니다. 문서에는 Vision(더 빠름), 장면 텍스트에는 ML Kit(더 정확)가 적합합니다.

Tesseract OCR: 오픈소스 대안

Tesseract OCR은 HP(1985~1998)가 개발하고 Google(2006+)이 유지 관리하는 오픈소스 텍스트 인식 엔진입니다. Tesseract 5(LSTM 기반)는 CRNN 신경망 아키텍처를 사용하여 Tesseract 4(클래식 + LSTM)보다 정확도가 크게 향상되었습니다. Tesseract는 키릴 문자, 아랍어, 히브리어, CJK를 포함한 100개 이상의 언어를 지원합니다. Android용 — tess-two(포크), iOS용 — swift-tesseract.

Tesseract 단점: 속도 50~200ms/프레임(CPU 전용, GPU 가속 없음), 엔진에 전달하기 전에 이미지 전처리(이진화, 데스큐, 방향 감지) 필요, 내장 텍스트 감지 없음 — 이미지 영역을 전달해야 함(종종 OpenCV Text Detection 또는 EAST와 함께 사용). Tesseract는 깨끗한 문서에서 90%, 장면 텍스트에서 ~70%의 정확도를 달성합니다.

Tesseract를 선택해야 하는 경우: 앱이 Google Play가 없는 기기(Huawei)에서 실행되거나, 희귀 언어(산스크리트어, 히브리어) 지원이 필요하거나, 완전한 OCR 파이프라인 사용자 정의(사용자 정의 폰트 학습)가 필요한 경우. 다른 모든 경우에는 ML Kit 또는 Vision이 더 빠르고 정확하며 코드가 적게 필요합니다. Tesseract는 타사 SDK에 제한이 있을 때만 정당화됩니다.

kotlin
// Tesseract OCR via tess-two
val tess = TessBaseAPI()
tess.init(dataPath, "rus+eng")
tess.pageSegMode = TessBaseAPI.PageSegMode.PSM_AUTO

val bitmap = BitmapFactory.decodeResource(resources, R.drawable.text)
val gray = Bitmap.createBitmap(bitmap.width, bitmap.height, Bitmap.Config.ARGB_8888)
OpenCV.process(bitmap, gray) // 이진화 + 데스큐

tess.setImage(gray)
val result = tess.utF8Text
tess.recycle()

Tesseract 전처리는 필수입니다: 그레이스케일 변환, 이진화(Otsu 또는 Adaptive), 데스큐, 노이즈 제거(median blur). 전처리 없이 Tesseract의 정확도는 50~60%로 떨어집니다. 전처리에 OpenCV를 사용하세요: Imgproc.cvtColor → Imgproc.threshold → Imgproc.erode/dilate → Core.rotate(deskew). 균일한 배경의 문서에는 이진화로 충분하지만, 장면 텍스트에는 전체 파이프라인이 필요합니다.

OCR을 위한 이미지 전처리

이미지 품질은 OCR 정확도의 주요 요소입니다. ML Kit와 Vision에는 내장 전처리가 있지만, 어려운 경우(어두운 사진, 흐림, 과다 노출) 추가 처리를 통해 정확도를 10~15% 높일 수 있습니다. 주요 기술: 대비 향상(CLAHE), 선명화(unsharp mask), 원근 보정(perspective transform), 그림자 및 반사 제거.

CLAHE(대비 제한 적응형 히스토그램 평활화) — 로컬 영역의 대비를 개선하는 적응형 히스토그램 평활화입니다. CLAHE는 조명이 고르지 않은 문서 사진(일부 그림자, 일부 조명)에 효과적입니다. clipLimit=2.0, tileGridSize=(8,8)의 OpenCV Core.createCLAHE는 OCR에 최적의 결과를 제공합니다. CLAHE 후 어두운 문서에서 ML Kit 정확도가 70%에서 88%로 향상됩니다.

원근 보정 — 각도로 촬영한 문서 사진에 필수입니다. 문서 정렬을 위해 OpenCV findHomography + warpPerspective를 사용하세요. 자동 문서 경계 감지를 위해 Canny edge detection + findContours + approxPolyDP를 사용하세요. 원근 보정 후 30° 이상 각도로 촬영한 사진의 OCR 정확도가 20~30% 향상됩니다.

kotlin
// CLAHE + OpenCV 전처리
val mat = Mat()
Utils.bitmapToMat(bitmap, mat)
Imgproc.cvtColor(mat, mat, Imgproc.COLOR_RGB2GRAY)

val clahe = Imgproc.createCLAHE(2.0, Size(8.0, 8.0))
clahe.apply(mat, mat)

Imgproc.GaussianBlur(mat, mat, Size(3.0, 3.0), 0.0)
Imgproc.threshold(mat, mat, 0.0, 255.0, Imgproc.THRESH_BINARY or Imgproc.THRESH_OTSU)

val processedBitmap = Bitmap.createBitmap(mat.cols(), mat.rows(), Bitmap.Config.ARGB_8888)
Utils.matToBitmap(mat, processedBitmap)

OCR 전 텍스트 감지 — 장면 텍스트의 경우 OCR에 전달하기 전에 EAST(효율적 정확한 장면 텍스트 감지기) 또는 CRAFT(문자 영역 인식 기반 텍스트 감지)를 사용하세요. EAST는 5~15ms 내에 장면의 텍스트 바운딩 박스를 감지합니다. CRAFT는 더 정확하지만(97%) 더 느립니다(50~100ms). 텍스트 감지를 통해 텍스트가 없는 영역을 필터링하고 관련 영역만 OCR에 전달하여 전체 처리를 가속화할 수 있습니다.

모바일 앱에서 OCR 활용

문서 스캔 — 가장 널리 사용되는 OCR 응용 프로그램입니다. 스캔 앱(CamScanner, Adobe Scan, Google Drive)은 ML Kit 또는 Vision을 사용하여 문서 사진에서 텍스트를 인식합니다. 일반적인 파이프라인: 문서 경계 감지 → 원근 보정 → CLAHE 처리 → OCR → 형식 지정(PDF, DOCX). ML Kit Text Recognition V2는 A4 페이지당 100~200ms로 처리합니다.

실시간 텍스트 번역 — OCR과 기계 번역의 조합입니다. Google Translate, Microsoft Translator, Yandex Translate는 카메라에서 텍스트를 인식하기 위해 ML Kit 또는 Vision을 사용하고 원본 텍스트 위에 번역을 오버레이합니다(AR 번역). 요구 사항: 편안한 UX를 위한 지연 시간 < 200ms. ML Kit V2 + NNAPI는 프레임당 30~80ms를 제공하여 번역 및 렌더링에 여유를 남깁니다.

자동 데이터 입력 — 명함, 은행 카드, 신분증에서 데이터를 추출하는 OCR입니다. ML Kit가 텍스트를 인식한 다음 후처리가 구조를 파싱합니다: 이름, 전화번호, 이메일(명함) 또는 카드 번호, 만료일, CVV(결제 카드). 명함의 경우 OCR 후 정규 표현식을 사용하세요. 은행 카드의 경우 — 특수 ML 모델(유료, ~99% 정확도).

swift
// OCR + AR 번역(간소화)
let request = VNRecognizeTextRequest { req, _ in
    guard let results = req.results as? [VNRecognizedTextObservation] else { return }
    for observation in results {
        let text = observation.topCandidates(1).first?.string ?? ""
        let rect = observation.boundingBox
        // 번역 및 사각형 위 AR 렌더링
        DispatchQueue.main.async {
            overlayView.showTranslation(text, at: rect)
        }
    }
}
request.recognitionLevel = .fast
request.usesLanguageCorrection = false

시각 장애인을 위한 OCR — 보조 기술: 앱이 포장, 메뉴, 간판의 텍스트를 소리내어 읽어줍니다. ML Kit OCR + Text-to-Speech(Android TTS / iOS AVSpeechSynthesizer)를 사용합니다. 주요 요구 사항 — 낮은 지연 시간(< 100ms)의 실시간 처리. Seeing AI(Microsoft)와 Envision AI가 이 접근 방식을 사용합니다. 접근성 앱의 경우 빠른 인식 모드를 사용하고 confidence로 필터링하지 마세요 — 어떤 텍스트든 사용자에게 가치가 있습니다.

자주 묻는 질문

모바일 애플리케이션에서 텍스트 인식(OCR)이란 무엇인가요?

텍스트 인식(OCR)은 앱이 사진과 비디오에서 텍스트를 읽을 수 있게 하는 기술입니다. 스마트폰 카메라가 이미지를 캡처하고, 기기의 신경망이 문자를 인식하여 기계가 읽을 수 있는 텍스트를 반환합니다. 모바일 앱에서 OCR은 문서 스캔, 카메라 번역, 명함 데이터 입력, 시각 장애인을 위한 접근성 인터페이스 생성에 사용됩니다.

Android에 적합한 OCR은 무엇인가요: ML Kit인가요 Tesseract인가요?

ML Kit Text Recognition이 Android에 가장 적합한 선택입니다: 96% 정확도, 10~30ms 속도, 45개 언어, NNAPI를 통한 GPU 가속, 모든 방향의 텍스트를 찾습니다. Tesseract는 오픈소스 대안(90% 정확도, 100개 이상 언어, CPU)으로 Google Play가 없는 기기나 희귀 언어에 적합합니다. 95%의 프로젝트에서는 ML Kit를 선택하세요 — 더 빠르고 정확하며 이미지 전처리가 필요하지 않습니다.

모바일 기기에서 OCR에 인터넷이 필요한가요?

아니요, ML Kit Text Recognition, Apple Vision 및 Tesseract는 모두 기기에서 완전히 작동합니다. ML Kit는 첫 실행 시 모델을 다운로드할 수 있으며(다운로드 모드), 이후 오프라인에서 작동합니다. Apple Vision은 iOS에 내장되어 있으며 인터넷이 필요하지 않습니다. Tesseract는 완전히 오프라인입니다. 클라우드 OCR(Google Cloud Vision, AWS Textract)은 인터넷을 통해 작동하지만 모바일 실시간 애플리케이션에서는 사용되지 않습니다.

ML Kit Text Recognition은 어떤 언어를 지원하나요?

ML Kit Text Recognition V2는 라틴 및 키릴 그룹의 45개 이상 언어를 지원합니다: 영어, 러시아어, 독일어, 프랑스어, 스페인어, 이탈리아어, 포르투갈어, 폴란드어, 우크라이나어, 루마니아어, 터키어 등. V1(CJK)은 추가로 중국어, 일본어, 한국어를 지원합니다. 전체 목록은 TextRecognizerOptions 문서를 참조하세요. 아랍어나 히브리어를 인식하려면 Tesseract(100개 이상 언어)를 사용하세요.

문서 사진에서 OCR 정확도를 향상시키는 방법은?

주요 방법: 문서 정렬(OpenCV를 통한 원근 보정), 대비 향상(CLAHE), 선명화(unsharp mask), 좋은 조명(연속 자동 노출), 카메라 안정화(OIS/EIS). ML Kit는 기본 왜곡을 자체 처리하지만 원근 왜곡(30° 초과)이 있는 문서의 경우 전처리를 통해 정확도가 20~30% 향상됩니다. 비디오에는 빠른 인식 모드를 사용하세요.

요약

  • 텍스트 인식 — 모바일 기기에서 OCR: 인쇄, 필기, 장면 텍스트
  • ML Kit V2 — 정확도 96%, 45개 이상 언어, 10~30ms, GPU/NPU 가속
  • Apple Vision — 네이티브 iOS OCR(iOS 13+), 13개 언어, ANE 통해
  • Tesseract 5 — 오픈소스, 100개 이상 언어, 50~200ms(CPU), Huawei용 대안
  • 전처리 — CLAHE, 데스큐, 원근 보정으로 정확도 10~30% 향상
  • 실시간 — ML Kit 또는 Vision으로 CameraX/AVFoundation 통해 최대 30FPS
  • 온디바이스 — 모든 계산 로컬, 데이터 프라이버시 보장

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기