[{"data":1,"prerenderedAt":27},["ShallowReactive",2],{"articolo-machine-learning-on-device-in-flutter-con-google-ml-kit-riconoscere-testo-volti-e-barcode":3,"comments-article-machine-learning-on-device-in-flutter-con-google-ml-kit-riconoscere-testo-volti-e-barcode":26},{"id":4,"title":5,"slug":6,"excerpt":7,"body":8,"cover_image":9,"cover_remote_url":10,"cover_credit":11,"video_url":15,"status":16,"published_at":17,"meta_title":18,"meta_description":19,"category":20,"author":24},60,"Machine learning on-device in Flutter con Google ML Kit: riconoscere testo, volti e barcode","machine-learning-on-device-in-flutter-con-google-ml-kit-riconoscere-testo-volti-e-barcode","Scopri come integrare il machine learning direttamente nell'app Flutter con google_ml_kit: OCR, scansione barcode e rilevamento volti senza connessione, sfruttando i modelli on-device di Google.","## Perché il machine learning on-device\n\nIntegrare funzionalità di intelligenza artificiale nelle app mobile non richiede necessariamente chiamate a servizi cloud costosi o dipendenti dalla connessione. Google **ML Kit** offre modelli pre-addestrati che girano **direttamente sul dispositivo**, garantendo bassa latenza, privacy dei dati e funzionamento offline.\n\nIn Flutter possiamo sfruttare questi modelli grazie ai pacchetti della famiglia `google_mlkit_*`, che espongono API native in Dart per riconoscimento del testo (OCR), scansione di barcode, rilevamento e tracciamento dei volti, etichettatura di immagini e molto altro.\n\nIn questo articolo vediamo come integrare tre casi d'uso concreti: **OCR**, **scansione barcode** e **rilevamento volti**.\n\n## Configurazione del progetto\n\nA differenza del vecchio pacchetto monolitico `google_ml_kit`, oggi è consigliato installare solo i moduli che servono, per ridurre la dimensione dell'app. Aggiungiamo le dipendenze necessarie:\n\n```yaml\ndependencies:\n  google_mlkit_text_recognition: ^0.13.0\n  google_mlkit_barcode_scanning: ^0.12.0\n  google_mlkit_face_detection: ^0.11.0\n  image_picker: ^1.1.2\n```\n\n### Configurazione iOS\n\nSu iOS il minimo supportato è iOS 15.5. Nel file `ios\u002FPodfile` assicurati di impostare la piattaforma:\n\n```ruby\nplatform :ios, '15.5'\n```\n\nAggiungi inoltre in `Info.plist` i permessi per fotocamera e libreria foto:\n\n```xml\n\u003Ckey>NSCameraUsageDescription\u003C\u002Fkey>\n\u003Cstring>Serve per acquisire immagini da analizzare\u003C\u002Fstring>\n\u003Ckey>NSPhotoLibraryUsageDescription\u003C\u002Fkey>\n\u003Cstring>Serve per selezionare immagini da analizzare\u003C\u002Fstring>\n```\n\n### Configurazione Android\n\nSu Android il `minSdkVersion` deve essere almeno 21. Se vuoi che i modelli vengano scaricati automaticamente dal Play Store, aggiungi nel `AndroidManifest.xml`:\n\n```xml\n\u003Cmeta-data\n    android:name=\"com.google.mlkit.vision.DEPENDENCIES\"\n    android:value=\"ocr,barcode,face\" \u002F>\n```\n\n## Riconoscimento del testo (OCR)\n\nIl riconoscimento del testo estrae stringhe da un'immagine. Partiamo da un `InputImage`, che può derivare da un file, da un percorso o da un frame della fotocamera.\n\n```dart\nimport 'package:google_mlkit_text_recognition\u002Fgoogle_mlkit_text_recognition.dart';\n\nFuture\u003CString> riconosciTesto(String imagePath) async {\n  final inputImage = InputImage.fromFilePath(imagePath);\n  final recognizer = TextRecognizer(script: TextRecognitionScript.latin);\n\n  try {\n    final RecognizedText result = await recognizer.processImage(inputImage);\n\n    final buffer = StringBuffer();\n    for (final block in result.blocks) {\n      for (final line in block.lines) {\n        buffer.writeln(line.text);\n      }\n    }\n    return buffer.toString();\n  } finally {\n    await recognizer.close();\n  }\n}\n```\n\nLa gerarchia dei risultati è **blocchi → righe → elementi**, e ogni livello espone un `boundingBox` con le coordinate, utile se vuoi disegnare riquadri sopra l'immagine originale. Ricorda sempre di chiamare `close()` per liberare le risorse native.\n\n## Scansione di barcode e QR code\n\nIl modulo barcode riconosce numerosi formati (QR, EAN, Code 128, ecc.) e restituisce sia il valore grezzo sia dati strutturati.\n\n```dart\nimport 'package:google_mlkit_barcode_scanning\u002Fgoogle_mlkit_barcode_scanning.dart';\n\nFuture\u003CList\u003CString>> scansionaBarcode(String imagePath) async {\n  final inputImage = InputImage.fromFilePath(imagePath);\n  final scanner = BarcodeScanner(formats: [BarcodeFormat.all]);\n\n  try {\n    final List\u003CBarcode> barcodes = await scanner.processImage(inputImage);\n\n    return barcodes.map((b) {\n      \u002F\u002F Dati tipizzati in base al tipo di contenuto\n      if (b.type == BarcodeType.url) {\n        final url = b.value as BarcodeUrl;\n        return 'URL: ${url.url}';\n      }\n      return b.displayValue ?? 'Sconosciuto';\n    }).toList();\n  } finally {\n    await scanner.close();\n  }\n}\n```\n\nOltre agli URL, ML Kit riconosce contatti (vCard), eventi calendario, coordinate geografiche, credenziali Wi-Fi e altro, esponendo tipi dedicati come `BarcodeWifi` o `BarcodeContactInfo`.\n\n## Rilevamento dei volti\n\nIl rilevamento dei volti individua i visi in un'immagine e, con le opzioni adeguate, può classificare espressioni (probabilità di sorriso), stimare l'apertura degli occhi e tracciare i contorni.\n\n```dart\nimport 'package:google_mlkit_face_detection\u002Fgoogle_mlkit_face_detection.dart';\n\nFuture\u003Cvoid> rilevaVolti(String imagePath) async {\n  final options = FaceDetectorOptions(\n    enableClassification: true, \u002F\u002F sorriso, occhi aperti\n    enableLandmarks: true,      \u002F\u002F occhi, naso, bocca\n    performanceMode: FaceDetectorMode.accurate,\n  );\n  final detector = FaceDetector(options: options);\n\n  try {\n    final faces = await detector.processImage(\n      InputImage.fromFilePath(imagePath),\n    );\n\n    for (final face in faces) {\n      final rect = face.boundingBox;\n      final smile = face.smilingProbability;\n      print('Volto in $rect, sorriso: ${smile?.toStringAsFixed(2)}');\n    }\n  } finally {\n    await detector.close();\n  }\n}\n```\n\nPer applicazioni come filtri realtà aumentata puoi abilitare anche `enableTracking`, così ogni volto mantiene un `trackingId` stabile tra un frame e l'altro.\n\n## Elaborazione in tempo reale dalla fotocamera\n\nPer analizzare lo stream della fotocamera, invece di partire da un file, costruisci l'`InputImage` a partire dai byte del frame usando `InputImage.fromBytes`, specificando `InputImageMetadata` con dimensioni, rotazione e formato. È fondamentale **evitare di processare ogni frame**: usa un flag booleano per saltare i frame mentre uno è ancora in elaborazione.\n\n```dart\nbool _isBusy = false;\n\nFuture\u003Cvoid> _processCameraImage(CameraImage image) async {\n  if (_isBusy) return;\n  _isBusy = true;\n  try {\n    \u002F\u002F costruisci InputImage.fromBytes e passalo al detector...\n  } finally {\n    _isBusy = false;\n  }\n}\n```\n\n## Best practice\n\n- **Chiudi sempre i detector** con `close()`: sono risorse native e non rilasciarle causa memory leak.\n- **Riutilizza** l'istanza del detector invece di crearne una nuova a ogni analisi.\n- Per lo streaming, esegui il throttling dei frame per non saturare la CPU.\n- Su Android considera la modalità con download dei modelli da Play Store per ridurre la dimensione dell'APK iniziale.\n- Gestisci i casi in cui il modello non è ancora scaricato, mostrando un feedback all'utente.\n\n## Conclusioni\n\nGoogle ML Kit porta il machine learning on-device in Flutter con un'API pulita e tipizzata, senza costi di backend né dipendenza dalla rete. Che tu debba costruire uno scanner di documenti, un lettore di QR code o un'esperienza AR basata sul volto, i moduli `google_mlkit_*` offrono un punto di partenza solido e performante. Il consiglio è di installare solo i moduli necessari e di gestire con cura il ciclo di vita dei detector.","https:\u002F\u002Fflutter.it\u002Fstorage\u002Farticles\u002Fe05ff000-c9aa-45d8-b9e2-23deb8cda33d.jpg","https:\u002F\u002Fimages.unsplash.com\u002Fphoto-1605451977027-3c129bcf452b?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w5NzA2NTJ8MHwxfHJhbmRvbXx8fHx8fHx8fDE3ODczMTIxMDV8&ixlib=rb-4.1.0&q=80&w=1080",{"name":12,"author_url":13,"photo_url":14},"Adam Bignell","https:\u002F\u002Funsplash.com\u002F@adam_29063","https:\u002F\u002Funsplash.com\u002Fphotos\u002Fpersons-eye-in-close-up-photography-RMih7p3W6t0",null,"published","2026-08-08T04:00:47+00:00","ML Kit in Flutter: OCR, barcode e volti on-device","Guida pratica per integrare il machine learning on-device in Flutter con Google ML Kit: OCR, scansione barcode e rilevamento volti senza cloud.",{"id":21,"name":22,"slug":23},1,"Guide","guide",{"id":21,"name":25},"Flutter Bot",[],1789205513902]