Flutter Pub Collection
[ ML Kit Text Recognition ]
Flutter 패키지

소개

Google ML Kit 기반 이미지 텍스트 인식 패키지 (OCR)

설치

pub.dev: https://pub.dev/packages/google_mlkit_text_recognition

$ flutter pub add google_mlkit_text_recognition
import 'package:google_mlkit_text_recognition/google_mlkit_text_recognition.dart';

Android: minSdkVersion 21

iOS: platform 15.5

1. 기본 OCR

이미지에서 텍스트 추출. 5단계로 간단하게 구현.

final recognizer = TextRecognizer();
final inputImage = InputImage.fromFile(imageFile);
final result = await recognizer.processImage(inputImage);
String text = result.text;
recognizer.close();

2. 언어별 인식

한국어, 일본어, 중국어 등 다양한 언어 지원.

// 한국어
final recognizer = TextRecognizer(
  script: TextRecognitionScript.korean
);

// 일본어, 중국어
TextRecognitionScript.japanese
TextRecognitionScript.chinese

3. 텍스트 구조 읽기

블록, 라인, 단어 단위로 세밀한 분석 가능.

for (TextBlock block in result.blocks) {
  print(block.text);
  for (TextLine line in block.lines) {
    for (TextElement word in line.elements) {
      print(word.text);
    }
  }
}

4. 실전 예제: 이미지에서 추출

갤러리에서 이미지 선택 후 텍스트 인식.

final image = await ImagePicker().pickImage(...);
final inputImage = InputImage.fromFile(File(image!.path));
final result = await recognizer.processImage(inputImage);
setState(() => text = result.text);

5. 실전 예제: 실시간 카메라

카메라 프리뷰에서 실시간 텍스트 인식.

controller.startImageStream((CameraImage image) {
  if (!isProcessing) {
    isProcessing = true;
    final input = InputImage.fromCameraImage(image);
    recognizer.processImage(input).then((result) {
      setState(() => text = result.text);
      isProcessing = false;
    });
  }
});

6. 성능 최적화: 모델 선택

속도 최적화 모델 선택으로 실시간 처리 성능 향상.

// 속도 우선 (실시간 처리)
final recognizer = TextRecognizer(
  script: TextRecognitionScript.latin
);

// 정확도와 속도 균형
final recognizer = TextRecognizer(
  script: TextRecognitionScript.korean
);

7. 메모리 관리

Recognizer는 반드시 close()로 해제. 메모리 누수 방지.

class TextRecognitionService {
  TextRecognizer? _recognizer;

  Future<void> initialize() async {
    _recognizer = TextRecognizer();
  }

  Future<void> dispose() async {
    await _recognizer?.close();
    _recognizer = null;
  }
}

// Widget에서 사용
@override
void dispose() {
  textRecognitionService.dispose();
  super.dispose();
}

8. 배치 처리

여러 이미지를 순차적으로 처리. 메모리 효율적.

Future<List<String>> processMultipleImages(
  List<File> images
) async {
  final recognizer = TextRecognizer();
  final results = <String>[];

  for (final image in images) {
    final inputImage = InputImage.fromFile(image);
    final result = await recognizer.processImage(inputImage);
    results.add(result.text);
  }

  await recognizer.close();
  return results;
}

9. On-Device 처리

ML Kit는 기본적으로 on-device 처리. 인터넷 연결 불필요, 프라이버시 보호.

// On-device 처리 (기본)
final recognizer = TextRecognizer();
// 네트워크 없이 동작
// 개인정보 기기 내 유지

final result = await recognizer.processImage(inputImage);
// 모든 처리가 기기에서 실행

10. 이미지 전처리

이미지 품질 향상으로 인식률 개선.

import 'package:image/image.dart' as img;

Future<File> preprocessImage(File file) async {
  final bytes = await file.readAsBytes();
  final image = img.decodeImage(bytes);

  // 대비 향상
  final processed = img.adjustColor(
    image!,
    contrast: 1.2,
    brightness: 1.1,
  );

  // 회전 보정
  final rotated = img.copyRotate(processed, angle: 0);

  final tempFile = File('${file.path}_processed.jpg');
  await tempFile.writeAsBytes(img.encodeJpg(rotated));
  return tempFile;
}

11. 에러 처리

안정적인 텍스트 인식을 위한 에러 핸들링.

Future<String?> recognizeTextSafely(File imageFile) async {
  try {
    final recognizer = TextRecognizer();
    final inputImage = InputImage.fromFile(imageFile);

    final result = await recognizer.processImage(inputImage);
    await recognizer.close();

    if (result.text.isEmpty) {
      return null; // 텍스트 없음
    }

    return result.text;
  } on MlKitException catch (e) {
    print('ML Kit 오류: $e');
    return null;
  } catch (e) {
    print('알 수 없는 오류: $e');
    return null;
  }
}

12. 실전 예제: 명함 스캔

명함에서 이름, 전화번호, 이메일 추출.

Future<BusinessCard> scanBusinessCard(File image) async {
  final recognizer = TextRecognizer();
  final inputImage = InputImage.fromFile(image);
  final result = await recognizer.processImage(inputImage);

  // 패턴 매칭으로 정보 추출
  final text = result.text;
  final emailRegex = RegExp(r'[\w\.-]+@[\w\.-]+\.\w+');
  final phoneRegex = RegExp(r'\d{2,3}-\d{3,4}-\d{4}');

  final email = emailRegex.firstMatch(text)?.group(0);
  final phone = phoneRegex.firstMatch(text)?.group(0);

  await recognizer.close();
  return BusinessCard(email: email, phone: phone);
}

13. 실전 예제: 문서 스캔

다중 페이지 문서를 순차 스캔하여 하나의 텍스트로 결합.

Future<String> scanDocument(List<File> pages) async {
  final recognizer = TextRecognizer();
  final documentText = StringBuffer();

  for (var i = 0; i < pages.length; i++) {
    final inputImage = InputImage.fromFile(pages[i]);
    final result = await recognizer.processImage(inputImage);

    documentText.writeln('--- Page ${i + 1} ---');
    documentText.writeln(result.text);
    documentText.writeln();
  }

  await recognizer.close();
  return documentText.toString();
}

14. 플랫폼별 주의사항

Android와 iOS에서 각각 최소 버전 요구사항 확인 필요.

// Android: minSdkVersion 21 필요
// android/app/build.gradle
android {
  defaultConfig {
    minSdkVersion 21
  }
}

// iOS: platform 15.5 필요
// ios/Podfile
platform :ios, '15.5'

15. 주의사항

안정적이고 효율적인 텍스트 인식을 위한 가이드.

// ✅ Recognizer 재사용
final recognizer = TextRecognizer(); // 한 번만 생성
// 여러 이미지 처리...
await recognizer.close(); // 마지막에 해제

// ✅ 실시간 처리 시 프레임 스킵
if (!isProcessing) {
  isProcessing = true;
  // 처리...
}

// ✅ 이미지 해상도 제한
// 너무 큰 이미지는 리사이즈
if (image.width > 1920) {
  image = resizeImage(image, 1920);
}

// ❌ 매 프레임마다 새 Recognizer 생성 금지
// ❌ close() 없이 Recognizer 방치 금지

패키지 정보

pub.dev: https://pub.dev/packages/google_mlkit_text_recognition

version: 0.15.0

likes: 362

Publisher: flutter-ml.dev