Riconoscimento del testo (OCR — Riconoscimento Ottico dei Caratteri) è una tecnologia per estrarre testo stampato o scritto a mano da immagini e flussi video. Nello sviluppo mobile, il riconoscimento del testo viene utilizzato per digitalizzare documenti, riconoscere targhe, leggere biglietti da visita e tradurre testo in tempo reale. Le principali soluzioni OCR mobili sono: ML Kit Text Recognition (Google), Vision Framework (Apple), Tesseract OCR (open-source). Secondo Google ML Kit, 2025, Text Recognition V2 elabora un fotogramma in 10–30 ms con una precisione del 96% in latino e 91% in cirillico.
Punti chiave
Riconoscimento del testo (OCR) è un processo di visione artificiale che converte immagini di testo in caratteri leggibili dalla macchina. L'OCR comprende fasi: pre-elaborazione dell'immagine (binarizzazione, deskew, correzione dell'inclinazione), segmentazione (divisione in righe, parole, caratteri), riconoscimento (classificazione di ogni carattere) e post-elaborazione (controllo dizionario, correzione errori). I moderni sistemi OCR (ML Kit, Vision) utilizzano reti neurali end-to-end che combinano tutte le fasi.
Tipi di OCR: testo stampato — riconoscimento di testo dattiloscritto da documenti, insegne, schermi — precisione 95–99%; testo scritto a mano — riconoscimento di scrittura manuale — precisione 80–90% in latino, 70–80% in cirillico; testo di scena — testo in scene naturali: numeri civici, segnali stradali, nomi di negozi — il più difficile a causa di distorsioni prospettiche e riflessi.
CRNN + CTC Loss — l'architettura utilizzata nei moderni modelli OCR. La Rete Neurale Convoluzionale Ricorrente (CNN + LSTM) estrae le caratteristiche dell'immagine, mentre la Classificazione Temporale Connessionista decodifica la sequenza di caratteri senza necessità di segmentazione preventiva. CRNN funziona con testi di qualsiasi lunghezza ed è robusta a inclinazioni e distorsioni. Secondo arXiv (2025), i modelli CRNN raggiungono il 97.5% di precisione sul benchmark ICDAR 2019.
| Soluzione OCR | Precisione | Velocità | Lingue | Piattaforma |
|---|---|---|---|---|
| ML Kit V2 | 96% | 10–30 ms | 45+ | Android, iOS |
| Apple Vision | 95% | 10–40 ms | 13+ | iOS, macOS |
| Tesseract 5 | 90% | 50–200 ms | 100+ | Multipiattaforma |
| Google Cloud Vision | 98% | 500–1000 ms | 200+ | Server (API) |
CRNN per dispositivi mobili — ML Kit utilizza un modello MobileNetV2 + CRNN con quantizzazione INT8. Il modello occupa 2–5 MB (latente) e viene eseguito su GPU/NPU tramite TFLite Delegate. A differenza di Tesseract (pipeline classico), l'OCR con reti neurali non richiede segmentazione separata dei caratteri ed è più robusto al rumore. Svantaggio: richiede GPU o NPU per il tempo reale — su CPU pura, la velocità scende a 5–10 FPS.
ML Kit Text Recognition è lo strumento OCR principale per le applicazioni mobili. È disponibile in due versioni: V2 (basata sul latino — ottimizzata per latino, cirillico, cifre) e V1 (latino + CJK — giapponese, cinese, coreano, ma più lento). V2 utilizza un modello CRNN end-to-end, V1 usa una CNN + LSTM più vecchia. Google raccomanda V2 per tutti i casi tranne quando è necessario il riconoscimento CJK.
Struttura del risultato ML Kit: Text → TextBlock → Line → Element (Word/Symbol). Ogni livello ha un bounding box, confidenza (0..1) e testo riconosciuto. Text è l'oggetto radice con fullText (tutto il testo riconosciuto in una riga). TextBlock è un blocco logico di testo (paragrafo, colonna). Line è una riga di testo. Element è una parola o un simbolo. Usa confidence per filtrare riconoscimenti imprecisi.
// 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 */ }
Riconoscimento del testo su iOS tramite ML Kit: l'API è simile ad Android ma usa UIImage/CVPixelBuffer invece di InputImage. ML Kit utilizza automaticamente Apple Neural Engine su A12+ tramite Core ML Delegate. Per iOS, ML Kit Text Recognition V2 raggiunge 15–30 ms su iPhone 15 Pro. Per prestazioni massime, converti UIImage in CVPixelBuffer prima di passarlo — questo riduce il sovraccarico di conversione.
Apple Vision Framework fornisce OCR nativo tramite VNRecognizeTextRequest (iOS 13+). Vision OCR utilizza Apple Neural Engine (ANE) e non richiede SDK aggiuntivi. Supporta 13 lingue (EN, FR, IT, DE, ES, PT, ZH, JP, KO, RU, AR, TH, VI). Vision rileva automaticamente la lingua del testo (correzione lingua) e supporta più lingue in un singolo fotogramma. Velocità — 10–40 ms su A16+.
Caratteristiche di Vision OCR: recognitionLevel (veloce vs accurato), automaticLanguageDetection, customWords (aggiunta termini specifici), supportsTop candidates (multiple varianti di riconoscimento per testo sfocato). La modalità veloce offre 90% di precisione in 10–20 ms, la modalità accurata 95% in 30–50 ms. Per la produzione, usa la modalità accurata con filtraggio per confidence >= 0.5.
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])
Vision vs ML Kit su iOS: Vision è più veloce sui dispositivi vecchi (iPhone X–13) grazie all'ANE integrato. ML Kit è più preciso su scene complesse (distorsioni, inclinazioni, riflessi) grazie al modello di Google addestrato su milioni di immagini scene text. Vision non supporta la confidenza per caratteri individuali (solo per parole), limitando il filtraggio. Per documenti — Vision (più veloce), per scene text — ML Kit (più preciso).
Tesseract OCR è un motore di riconoscimento testo open-source sviluppato da HP (1985–1998) e mantenuto da Google (2006+). Tesseract 5 (basato su LSTM) utilizza l'architettura di rete neurale CRNN, fornendo un aumento significativo di precisione rispetto a Tesseract 4 (classico + LSTM). Tesseract supporta 100+ lingue, inclusi cirillico, arabo, ebraico e CJK. Per Android — tess-two (fork), per iOS — swift-tesseract.
Svantaggi di Tesseract: velocità 50–200 ms per fotogramma (solo CPU, nessuna accelerazione GPU), richiede pre-elaborazione dell'immagine (binarizzazione, deskew, rilevamento orientamento) prima di passare al motore, nessun rilevamento testo integrato — bisogna passare la regione dell'immagine (spesso insieme a OpenCV Text Detection o EAST). Tesseract raggiunge il 90% di precisione su documenti puliti e ~70% su scene text.
Quando scegliere Tesseract: se l'app funziona su dispositivi senza Google Play (Huawei), ha bisogno di supporto per lingue rare (sanscrito, ebraico), o richiede personalizzazione completa del pipeline OCR (addestramento su caratteri personalizzati). Per tutti gli altri casi, ML Kit o Vision sono più veloci, precisi e richiedono meno codice. Tesseract è giustificato solo quando ci sono restrizioni su SDK di terze parti.
// 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) // Binarizzazione + deskew
tess.setImage(gray)
val result = tess.utF8Text
tess.recycle()
Pre-elaborazione per Tesseract è obbligatoria: conversione in scala di grigi, binarizzazione (Otsu o Adaptive), deskew, rimozione rumore (median blur). Senza pre-elaborazione, la precisione di Tesseract scende al 50–60%. Usa OpenCV per la pre-elaborazione: Imgproc.cvtColor → Imgproc.threshold → Imgproc.erode/dilate → Core.rotate (deskew). Per documenti con sfondo uniforme, la binarizzazione è sufficiente; per scene text, è necessario un pipeline completo.
La qualità dell'immagine è il fattore principale per la precisione dell'OCR. ML Kit e Vision hanno pre-elaborazione integrata, ma per casi difficili (foto scure, sfocate, sovraesposte), l'elaborazione aggiuntiva migliora la precisione del 10–15%. Tecniche principali: miglioramento del contrasto (CLAHE), nitidezza (unsharp mask), correzione prospettica (perspective transform), rimozione di ombre e riflessi.
CLAHE (Equalizzazione dell'istogramma adattativa a contrasto limitato) — equalizzazione adattativa dell'istogramma che migliora il contrasto nelle regioni locali. CLAHE è efficace per foto di documenti con illuminazione non uniforme (parte in ombra, parte illuminata). OpenCV Core.createCLAHE con clipLimit=2.0 e tileGridSize=(8,8) dà risultati ottimali per OCR. Dopo CLAHE, la precisione di ML Kit su documenti scuri migliora dal 70% all'88%.
Correzione prospettica — obbligatoria per foto di documenti scattate ad angolo. Usa OpenCV findHomography + warpPerspective per allineare il documento. Per il rilevamento automatico dei bordi del documento, usa Canny edge detection + findContours + approxPolyDP. Dopo la correzione prospettica, la precisione dell'OCR migliora del 20–30% per scatti con angoli >30°.
// CLAHE + pre-elaborazione 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)
Rilevamento testo prima dell'OCR — per scene text, usa EAST (Rilevatore di testo di scena efficiente e accurato) o CRAFT (Consapevolezza della regione dei caratteri per il rilevamento del testo) prima di passare all'OCR. EAST rileva i bounding box del testo in una scena in 5–15 ms. CRAFT è più preciso (97%) ma più lento (50–100 ms). Il rilevamento del testo consente di filtrare le aree senza testo e passare solo le regioni pertinenti all'OCR, accelerando l'elaborazione complessiva.
Scansione documenti — l'applicazione più diffusa dell'OCR. Le app di scansione (CamScanner, Adobe Scan, Google Drive) usano ML Kit o Vision per riconoscere il testo da foto di documenti. Pipeline tipico: rilevamento bordi documento → correzione prospettica → elaborazione CLAHE → OCR → formattazione (PDF, DOCX). ML Kit Text Recognition V2 lo gestisce in 100–200 ms per pagina A4.
Traduzione testo in tempo reale — combinazione di OCR e traduzione automatica. Google Traduttore, Microsoft Translator, Yandex Translate usano ML Kit o Vision per riconoscere il testo dalla fotocamera e sovrappongono la traduzione al testo originale (traduzione AR). Requisito: latenza < 200 ms per una UX confortevole. ML Kit V2 + NNAPI offre 30–80 ms per fotogramma, lasciando margine per traduzione e rendering.
Inserimento dati automatico — OCR per estrarre dati da biglietti da visita, carte bancarie, documenti d'identità. ML Kit riconosce il testo, poi il post-elaborazione analizza la struttura: nome, telefono, email (biglietti da visita) o numero carta, scadenza, CVV (carte di pagamento). Per biglietti da visita, usa espressioni regolari dopo l'OCR. Per carte bancarie — modelli ML specializzati (a pagamento, ~99% di precisione).
// OCR + traduzione AR (semplificata)
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
// Traduzione e rendering AR sul rettangolo
DispatchQueue.main.async {
overlayView.showTranslation(text, at: rect)
}
}
}
request.recognitionLevel = .fast
request.usesLanguageCorrection = false
OCR per persone con disabilità visiva — Tecnologia assistiva: le app leggono ad alta voce il testo da imballaggi, menu, insegne. Usano ML Kit OCR + Text-to-Speech (Android TTS / iOS AVSpeechSynthesizer). Requisito chiave — tempo reale con bassa latenza (< 100 ms). Seeing AI (Microsoft) e Envision AI usano questo approccio. Per le app di accessibilità, usa la modalità di riconoscimento rapido e non filtrare per confidenza — qualsiasi testo è prezioso per l'utente.
Domande frequenti
Riconoscimento del testo (OCR) è una tecnologia che permette a un'app di "leggere" il testo da foto e video. La fotocamera dello smartphone cattura un'immagine, la rete neurale sul dispositivo riconosce i caratteri e restituisce testo leggibile dalla macchina. Nelle app mobili, l'OCR viene utilizzato per scansionare documenti, tradurre con la fotocamera, inserire dati da biglietti da visita e creare interfacce accessibili per persone con disabilità visiva.
ML Kit Text Recognition è la scelta migliore per Android: 96% di precisione, velocità 10–30 ms, 45 lingue, accelerazione GPU tramite NNAPI, trova testo in qualsiasi orientamento. Tesseract è un'alternativa open-source (90% di precisione, 100+ lingue, CPU), adatta per dispositivi senza Google Play o lingue rare. Per il 95% dei progetti, scegli ML Kit — è più veloce, preciso e non richiede pre-elaborazione dell'immagine.
No, ML Kit Text Recognition, Apple Vision e Tesseract funzionano completamente sul dispositivo. ML Kit può scaricare il modello al primo avvio (modalità scaricata), dopodiché funziona offline. Apple Vision è integrato in iOS e non richiede Internet. Tesseract è completamente offline. L'OCR cloud (Google Cloud Vision, AWS Textract) funziona via Internet ma non viene utilizzato nelle applicazioni mobili in tempo reale.
ML Kit Text Recognition V2 supporta 45+ lingue dei gruppi latino e cirillico: inglese, russo, tedesco, francese, spagnolo, italiano, portoghese, polacco, ucraino, rumeno, turco e altre. V1 (CJK) supporta inoltre cinese, giapponese, coreano. Elenco completo — nella documentazione di TextRecognizerOptions. Per riconoscere arabo o ebraico, usa Tesseract (>100 lingue).
Metodi principali: allineamento del documento (correzione prospettica tramite OpenCV), miglioramento del contrasto (CLAHE), nitidezza (unsharp mask), buona illuminazione (auto-esposizione continua), stabilizzazione della fotocamera (OIS/EIS). ML Kit gestisce le distorsioni di base da solo, ma per documenti con distorsioni prospettiche (>30°), la pre-elaborazione migliora la precisione del 20–30%. Usa la modalità di riconoscimento rapido per i video.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche