
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
이미지에서 텍스트 추출. 5단계로 간단하게 구현.
final recognizer = TextRecognizer();
final inputImage = InputImage.fromFile(imageFile);
final result = await recognizer.processImage(inputImage);
String text = result.text;
recognizer.close();한국어, 일본어, 중국어 등 다양한 언어 지원.
// 한국어
final recognizer = TextRecognizer(
script: TextRecognitionScript.korean
);
// 일본어, 중국어
TextRecognitionScript.japanese
TextRecognitionScript.chinese블록, 라인, 단어 단위로 세밀한 분석 가능.
for (TextBlock block in result.blocks) {
print(block.text);
for (TextLine line in block.lines) {
for (TextElement word in line.elements) {
print(word.text);
}
}
}갤러리에서 이미지 선택 후 텍스트 인식.
final image = await ImagePicker().pickImage(...);
final inputImage = InputImage.fromFile(File(image!.path));
final result = await recognizer.processImage(inputImage);
setState(() => text = result.text);카메라 프리뷰에서 실시간 텍스트 인식.
controller.startImageStream((CameraImage image) {
if (!isProcessing) {
isProcessing = true;
final input = InputImage.fromCameraImage(image);
recognizer.processImage(input).then((result) {
setState(() => text = result.text);
isProcessing = false;
});
}
});속도 최적화 모델 선택으로 실시간 처리 성능 향상.
// 속도 우선 (실시간 처리)
final recognizer = TextRecognizer(
script: TextRecognitionScript.latin
);
// 정확도와 속도 균형
final recognizer = TextRecognizer(
script: TextRecognitionScript.korean
);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();
}여러 이미지를 순차적으로 처리. 메모리 효율적.
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;
}ML Kit는 기본적으로 on-device 처리. 인터넷 연결 불필요, 프라이버시 보호.
// On-device 처리 (기본)
final recognizer = TextRecognizer();
// 네트워크 없이 동작
// 개인정보 기기 내 유지
final result = await recognizer.processImage(inputImage);
// 모든 처리가 기기에서 실행이미지 품질 향상으로 인식률 개선.
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;
}안정적인 텍스트 인식을 위한 에러 핸들링.
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;
}
}명함에서 이름, 전화번호, 이메일 추출.
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);
}다중 페이지 문서를 순차 스캔하여 하나의 텍스트로 결합.
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();
}Android와 iOS에서 각각 최소 버전 요구사항 확인 필요.
// Android: minSdkVersion 21 필요
// android/app/build.gradle
android {
defaultConfig {
minSdkVersion 21
}
}
// iOS: platform 15.5 필요
// ios/Podfile
platform :ios, '15.5'안정적이고 효율적인 텍스트 인식을 위한 가이드.
// ✅ 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