Gereksinimler ve Ön Hazırlık
Geliştirmeye başlamadan önce sistemin doğru çalışması için gerekli olan kütüphaneleri ve ortam ayarlarını yapmalıyız. Flutter projenizde kullanacağımız temel paketler şunlardır:
- camerakit: Kamera erişimi ve görüntü akışı için.
- google_mlkit_text_recognition: Görüntüden metin ayıklama için.
- image_cropper: Taranan dokümanın köşelerini kırpmak için.
- permission_handler: Kullanıcıdan kamera izinlerini almak için.
Projenizin pubspec.yaml dosyasına şu bağımlılıkları ekleyerek işe başlayın:
dependencies:
flutter:
sdk: flutter
google_mlkit_text_recognition: ^0.13.0
image_picker: ^1.1.0
image_cropper: ^8.0.0
permission_handler: ^11.0.0
Kurulum sonrası flutter pub get komutunu çalıştırarak paketleri projenize dahil edin. iOS tarafında Info.plist, Android tarafında ise AndroidManifest.xml dosyalarına kamera kullanım izinlerini eklemeyi unutmayın.
Adım 1: Kamera Erişimi ve Görüntü Yakalama
İleri düzey bir doküman tarama sistemi, sadece fotoğraf çekmekle kalmaz; aynı zamanda görüntünün netliğini kontrol etmelidir. Kullanıcıdan izin alarak kamerayı başlatmak için şu yapıyı kullanırız:
Future captureImage() async {
final status = await Permission.camera.request();
if (status.isGranted) {
final ImagePicker picker = ImagePicker();
final XFile? photo = await picker.pickImage(source: ImageSource.camera);
if (photo != null) {
// Görüntü alındı, sonraki adıma geçilebilir.
processImage(photo.path);
}
} else {
throw Exception("Kamera izni reddedildi.");
}
}
Bu kod bloğu, kullanıcının kamera iznini denetler ve başarılı olursa ImagePicker üzerinden bir görüntü dosyası yakalar. Hata yönetimi için izinlerin reddedilme durumunu mutlaka kontrol etmelisiniz.
Adım 2: Görüntü İşleme ve Perspektif Düzeltme
Dokümanlar genellikle eğik açılarla taranır. image_cropper paketi, kullanıcının belge sınırlarını manuel veya otomatik olarak seçmesine olanak tanır. Bu, OCR başarısını doğrudan etkiler.
Future cropImage(String imagePath) async {
return await ImageCropper().cropImage(
sourcePath: imagePath,
aspectRatioPresets: [CropAspectRatioPreset.original],
uiSettings: [
AndroidUiSettings(toolbarTitle: 'Belgeyi Kırp', lockAspectRatio: false),
IOSUiSettings(title: 'Belgeyi Kırp'),
],
);
}
Kırpma işlemi, OCR motorunun gereksiz arka plan gürültüsünden kurtulmasını sağlar. Bu adım, metin tanıma doğruluğunu %40 oranında artırabilir.
Adım 3: Google ML Kit ile OCR Uygulama
Görüntü hazırlandıktan sonra, Google ML Kit'in TextRecognizer sınıfını kullanarak metinleri ayıklıyoruz. Bu işlem cihaz üzerinde (on-device) çalıştığı için internet bağlantısına ihtiyaç duymaz ve oldukça hızlıdır.
Future extractText(String imagePath) async {
final inputImage = InputImage.fromFilePath(imagePath);
final textRecognizer = TextRecognizer(script: TextRecognitionScript.latin);
try {
final RecognizedText recognizedText = await textRecognizer.processImage(inputImage);
return recognizedText.text;
} finally {
textRecognizer.close();
}
}
Burada textRecognizer.close() metodunu finally bloğu içerisinde kullanmak, bellek sızıntılarını (memory leaks) önlemek için kritiktir.
Doküman Tarama Yöntemleri Karşılaştırması
| Yöntem | Avantaj | Dezavantaj |
|---|---|---|
| Cihaz İçi (ML Kit) | Hızlı, çevrimdışı, gizli | Cihaz donanımına bağımlı |
| Bulut Tabanlı (Cloud OCR) | Çok yüksek doğruluk | İnternet gerektirir, gecikmeli |
Adım 4: Güvenlik ve Veri Gizliliği
Kritik Güvenlik Uyarısı: Kullanıcı verilerini (taranan dokümanlar) işlerken, verilerin cihazdan dışarı çıkıp çıkmadığını kontrol edin. Hassas belgeler (kimlik, fatura) için yerel depolama ve şifreleme (AES-256) kullanılması zorunludur. Uygulama içi verileri asla güvensiz log dosyalarına yazdırmayın.
Veri güvenliğini sağlamak için flutter_secure_storage paketini kullanarak taranan metinleri şifrelenmiş bir şekilde saklayabilirsiniz.
Adım 5: Kullanıcı Deneyimi (UX) İyileştirmeleri
OCR işlemi sırasında kullanıcıya bir "yükleniyor" animasyonu göstermek, uygulamanın donmadığını hissettirmek için önemlidir. Ayrıca, tanınan metnin doğruluğunu artırmak için bir düzenleme ekranı sunmalısınız.
// Basit bir OCR sonuç gösterim fonksiyonu
void showResultDialog(BuildContext context, String text) {
showDialog(
context: context,
builder: (_) => AlertDialog(
title: Text("Tanınan Metin"),
content: SingleChildScrollView(child: Text(text)),
actions: [TextButton(onPressed: () => Navigator.pop(context), child: Text("Tamam"))],
),
);
}
Sıkça Sorulan Sorular
OCR doğruluğunu nasıl artırabilirim?
Daha iyi aydınlatma, yüksek çözünürlüklü kamera kullanımı ve görüntü işleme aşamasında kontrast ayarları yaparak OCR başarısını önemli ölçüde artırabilirsiniz.
Bu sistem el yazısını okuyabilir mi?
Google ML Kit, belirli düzeyde el yazısını destekler ancak matbu (basılı) metinlerdeki kadar yüksek doğruluk oranına sahip değildir.
İnternet bağlantısı olmadan çalışır mı?
Evet, kullanılan ML Kit kütüphaneleri cihaz üzerinde (on-device) çalıştığı için çevrimdışı modda tam performansla çalışır.
Uygulamamın boyutu çok artar mı?
ML Kit modelleri, Android ve iOS paketlerinize ek yük getirir. Ancak "Dynamic Feature Delivery" kullanarak sadece ihtiyaç duyulduğunda indirilmesini sağlayabilirsiniz.
Hangi dosya formatları destekleniyor?
Genellikle JPEG, PNG ve HEIF formatları mobil cihazlarda en iyi sonucu verir.
İleri Düzey Performans Optimizasyonu ve Bellek Yönetimi
Mobil cihazlarda görüntü işleme ve OCR süreçleri, işlemci (CPU) ve bellek (RAM) üzerinde ciddi bir yük oluşturur. Özellikle yüksek çözünürlüklü fotoğraflar üzerinde çalışırken uygulamanın "donmasını" veya "çökmesini" (OOM - Out of Memory) engellemek için stratejik yaklaşımlar benimsemelisiniz.
Görüntü Boyutlandırma Stratejileri
Kameradan gelen ham görüntü genellikle 12MP veya daha fazladır. OCR motoru bu kadar yüksek çözünürlüğe ihtiyaç duymaz. Görüntüyü işlemeden önce belirli bir boyuta indirgemek, işlem süresini %60 oranında azaltabilir.
import 'dart:io';
import 'package:image/image.dart' as img;
Future optimizeImage(File file) async {
final bytes = await file.readAsBytes();
final image = img.decodeImage(bytes);
// OCR için ideal genişlik genellikle 1024-1280 pikseldir
final resized = img.copyResize(image!, width: 1024);
final compressedFile = File(file.path)..writeAsBytesSync(img.encodeJpg(resized, quality: 85));
return compressedFile;
}
İş parçacığı (Isolate) Kullanımı
Flutter'da ağır görüntü işleme görevlerini ana (UI) iş parçacığında çalıştırmak, arayüzün takılmasına neden olur. OCR işlemlerini compute fonksiyonu veya doğrudan Isolate kullanarak arka planda çalıştırmak zorunludur.
Hata Ayıklama ve OCR Başarı Oranı Analizi
Geliştirme sürecinde OCR sonuçlarının neden düşük çıktığını anlamak için bir "Hata Ayıklama Paneli" oluşturmak, projenin sürdürülebilirliği için kritiktir. Kullanıcıya metnin hangi kısımlarının düşük güven (confidence) puanı ile okunduğunu göstermek, kullanıcıyı fotoğrafı yeniden çekmeye teşvik edebilir.
Güven Puanı (Confidence Score) Kontrolü
Google ML Kit, her metin bloğu için bir güven puanı döndürür. Bu puanı kullanarak, sistemin "emin olmadığı" verileri işaretleyebilir veya kullanıcıdan onay isteyebilirsiniz.
void analyzeResults(RecognizedText recognizedText) {
for (TextBlock block in recognizedText.blocks) {
for (TextLine line in block.lines) {
// 0.8'in altındaki güven puanlarını kırmızı ile işaretle
if (line.confidence != null && line.confidence! < 0.8) {
print('Düşük güvenle okunan satır: ${line.text}');
}
}
}
}
Geliştirme İçin İpuçları
- Işıklandırma Kontrolü: Kullanıcıya canlı önizleme sırasında "Daha iyi ışıkta çekin" gibi uyarılar veren bir sensör entegrasyonu yapın.
- Kontrast Artırma: OCR öncesi görüntüye
ColorMatrixuygulayarak metin ve arka plan arasındaki kontrastı yapay olarak artırın. - Önbellekleme: Aynı doküman üzerinde tekrar tekrar işlem yapmamak için sonuçları yerel bir veritabanında (Hive veya SQLite) saklayın.
Sonuç
Flutter ile profesyonel bir doküman tarama ve OCR sistemi geliştirmek, doğru kütüphane seçimi ve kullanıcı deneyimi odaklı bir yaklaşımla oldukça verimli bir süreçtir. Bu rehberde, kamera erişiminden metin ayıklamaya kadar olan temel akışı öğrendiniz. Bir sonraki adımda, elde edilen metinleri yapılandırılmış veri (JSON) formatına dönüştürmek için LLM (Büyük Dil Modelleri) entegrasyonu yaparak sisteminizi daha akıllı hale getirebilirsiniz.
Sorumluluk Reddi: Bu makaledeki kod örnekleri eğitim amaçlıdır. Üretim ortamına (production) almadan önce tüm güvenlik açıklarını, veri gizliliği politikalarını ve yasal düzenlemeleri (KVKK/GDPR) gözden geçirmeli ve gerekli testleri yapmalısınız.


Yorumlar (0)
Yorum Yaz