Comment extraire du texte d’images avec le Kit de développement logiciel (SDK) Machine Learning de Google

Auteur: John Stephens
Date De Création: 27 Janvier 2021
Date De Mise À Jour: 5 Juillet 2024
Anonim
Comment extraire du texte d’images avec le Kit de développement logiciel (SDK) Machine Learning de Google - Applications
Comment extraire du texte d’images avec le Kit de développement logiciel (SDK) Machine Learning de Google - Applications

Contenu


Vous pouvez également utiliser l’API de reconnaissance de texte comme base d’applications de traduction ou de services d’accessibilité dans le cadre desquels l’utilisateur peut pointer son appareil photo sur tout texte avec lequel il se débat et le lire à haute voix.

Dans ce didacticiel, nous allons jeter les bases d'un large éventail de fonctionnalités innovantes en créant une application capable d'extraire du texte à partir d'une image de la galerie de l'utilisateur. Même si nous ne couvrirons pas ce didacticiel, vous pouvez également capturer du texte provenant de l’environnement de l’utilisateur en temps réel en connectant cette application à la caméra de l’appareil.

Sur l'appareil ou dans le nuage?

Certaines des API de kit ML sont uniquement disponibles sur le périphérique, mais quelques-unes sont disponibles sur le périphérique et dans le cloud, y compris l'API de reconnaissance de texte.


L'API textuelle en nuage peut identifier un plus grand nombre de langues et de caractères et promet une plus grande précision que son homologue intégrée à l'appareil. Cependant, il Est-ce que nécessite une connexion Internet active et est uniquement disponible pour les projets de niveau Blaze.

Dans cet article, nous allons exécuter l’API de reconnaissance de texte localement pour que vous puissiez suivre, que vous ayez effectué la mise à niveau vers Blaze ou avec le plan gratuit Firebase Spark.

Création d'une application de reconnaissance de texte avec ML Kit

Créez une application avec les paramètres de votre choix, mais lorsque vous y êtes invité, sélectionnez le modèle «Activité vide».

ML Kit SDK fait partie de Firebase. Par conséquent, vous devrez connecter votre projet à Firebase à l’aide de son certificat de signature SHA-1. Pour obtenir le SHA-1 de votre projet:


  • Sélectionnez l'onglet “Gradle” d'Android Studio.
  • Dans le panneau "Projets Gradle", double-cliquez pour développer la "racine" de votre projet, puis sélectionnez "Tâches> Android> Rapport de signature."
  • Le panneau situé au bas de la fenêtre d'Android Studio doit être mis à jour pour afficher des informations sur ce projet, notamment son certificat de signature SHA-1.

Pour connecter votre projet à Firebase:

  • Dans votre navigateur Web, lancez la console Firebase.
  • Sélectionnez "Ajouter un projet".
  • Donnez un nom à votre projet. J'utilise «ML Test».
  • Lisez les conditions générales et, si vous le souhaitez, sélectionnez "J'accepte ..." puis "Créer un projet".
  • Sélectionnez "Ajouter Firebase à votre application Android".
  • Entrez le nom du package de votre projet, que vous trouverez en haut du fichier MainActivity et dans le manifeste.
  • Entrez le certificat de signature SHA-1 de votre projet.
  • Cliquez sur «Enregistrer l'application».
  • Sélectionnez «Télécharger google-services.json». Ce fichier contient toutes les métadonnées Firebase nécessaires à votre projet, y compris la clé d'API.
  • Dans Android Studio, faites glisser le fichier google-services.json dans le répertoire "app" de votre projet.

  • Ouvrez votre fichier build.gradle au niveau du projet et ajoutez le chemin d'accès aux classes des services Google:

classpath com.google.gms: google-services: 4.0.1

  • Ouvrez votre fichier build.gradle au niveau de l'application et ajoutez des dépendances pour Firebase Core, Firebase ML Vision et l'interpréteur de modèle, ainsi que pour le plug-in de services Google:

apply plugin: com.google.gms.google-services ... ... ... dépendances {implémentation fileTree (répertoire: libs, inclure:) implémentation com.google.firebase: firebase-core: implémentation 16.0.1. google.firebase: firebase-ml-vision: 16.0.0 implémentation com.google.firebase: firebase-ml-model-interpreter: 16.0.0

À ce stade, vous devez exécuter votre projet pour qu’il puisse se connecter aux serveurs Firebase:

  • Installez votre application sur un smartphone ou une tablette physique Android, ou sur un périphérique virtuel Android (AVD).
  • Dans la console Firebase, sélectionnez «Exécuter l’application pour vérifier l’installation».
  • Après quelques instants, vous devriez voir un “Félicitations”; sélectionnez «Continuer vers la console».

Téléchargez les modèles d'apprentissage automatique pré-formés de Google

Par défaut, ML Kit ne télécharge que les modèles au fur et à mesure des besoins. Notre application télécharge le modèle OCR lorsque l'utilisateur tente d'extraire du texte pour la première fois.

Cela pourrait potentiellement avoir un impact négatif sur l'expérience utilisateur. Imaginez-vous essayer d'accéder à une fonctionnalité, uniquement pour découvrir que l'application doit télécharger plus de ressources avant de pouvoir réellement fournir cette fonctionnalité. Dans le pire des cas, votre application risque même de ne pas pouvoir télécharger les ressources dont elle a besoin, lorsqu'elle en a besoin, par exemple si l'appareil ne dispose pas d'une connexion Internet.

Pour que cela ne se produise pas avec notre application, je vais télécharger le modèle OCR nécessaire au moment de l'installation, ce qui nécessite quelques modifications dans Maniest.

Pendant que le manifeste est ouvert, je vais également ajouter l’autorisation WRITE_EXTERNAL_STORAGE, que nous utiliserons plus tard dans ce didacticiel.

// Ajouter l'autorisation WRITE_EXTERNAL_STORAGE // // Ajoute le suivant //

Construire la mise en page

Éliminons les trucs faciles et créons une mise en page composée de:

  • Un ImageView. Initialement, cela va afficher un espace réservé, mais il sera mis à jour une fois que l'utilisateur aura sélectionné une image de sa galerie.
  • Un bouton qui déclenche l'extraction du texte.
  • Un TextView, où nous afficherons le texte extrait.
  • Un ScrollView. Comme il n’ya aucune garantie que le texte extrait tienne parfaitement à l’écran, je vais placer le TextView dans un ScrollView.

Voici le fichier activity_main.xml terminé:

Cette mise en page fait référence à un dessin «ic_placeholder». Créons donc ceci maintenant:

  • Sélectionnez «Fichier> Nouveau> Fonds d'image» dans la barre d'outils d'Android Studio.
  • Ouvrez le menu déroulant "Type d'icône" et sélectionnez "Icônes de la barre d'action et des onglets".
  • Assurez-vous que le bouton radio «Clip Art» est sélectionné.
  • Cliquez sur le bouton "Clip Art".
  • Sélectionnez l'image que vous souhaitez utiliser comme espace réservé. J'utilise «Ajouter aux photos».
  • Cliquez sur OK."
  • Ouvrez le menu déroulant «Thème» et sélectionnez «HOLO_LIGHT».
  • Dans le champ «Nom», entrez «ic_placeholder».
  • Cliquez sur "Suivant". Lisez les informations. Si vous souhaitez continuer, cliquez sur "Terminer".

Icônes de la barre d'action: Lancement de l'application Galerie

Ensuite, je vais créer un élément de barre d’action qui lancera la galerie de l’utilisateur, prêt à ce qu’il sélectionne une image.

Vous définissez des icônes de barre d’action dans un fichier de ressources de menu, situé dans le répertoire «res / menu». Si votre projet ne contient pas ce répertoire, vous devrez le créer:

  • Tout en maintenant la touche Contrôle enfoncée, cliquez sur le répertoire «res» de votre projet, puis sélectionnez «Nouveau> Répertoire de ressources Android».
  • Ouvrez le menu déroulant «Type de ressource» et sélectionnez «Menu».
  • Le «nom du répertoire» devrait automatiquement passer à «menu», mais s'il ne le fait pas, vous devrez le renommer manuellement.
  • Cliquez sur OK."

Vous êtes maintenant prêt à créer le fichier de ressources de menu:

  • Tout en maintenant la touche Contrôle enfoncée, cliquez sur le répertoire «menu» de votre projet, puis sélectionnez «Nouveau> Fichier de ressources de menu».
  • Nommez ce fichier «my_menu».
  • Cliquez sur OK."
  • Ouvrez le fichier “my_menu.xml” et ajoutez ce qui suit:

//Créé un élément pour chaque action //

Le fichier de menu fait référence à une chaîne «action_gallery». Ouvrez le fichier res / values ​​/ strings.xml de votre projet et créez cette ressource. Pendant que je suis ici, je définis également les autres chaînes que nous utiliserons tout au long de ce projet.

Galerie Cette application doit accéder aux fichiers sur votre appareil. Aucun texte trouvé

Ensuite, utilisez Image Asset Studio pour créer l’icône «ic_gallery» de la barre d’action:

  • Sélectionnez «Fichier> Nouveau> Image Asset».
  • Définissez le menu déroulant «Type d’icône» sur «Icônes de barre d’action et de tabulation».
  • Cliquez sur le bouton "Clip Art".
  • Choisissez un drawable; J'utilise «image».
  • Cliquez sur OK."
  • Pour vous assurer que cette icône est clairement visible dans la barre d'action, ouvrez le menu déroulant «Thème» et sélectionnez «HOLO_DARK».
  • Nommez cette icône "ic_gallery".
  • Cliquez sur «Suivant», puis sur «Terminer».

Gestion des demandes d'autorisation et des événements de clic

Je vais effectuer toutes les tâches qui ne sont pas directement liées à l'API de reconnaissance de texte dans une classe BaseActivity distincte, notamment l'instanciation du menu, la gestion des événements de clic de la barre d'action et la demande d'accès au stockage du périphérique.

  • Sélectionnez "Fichier> Nouveau> Classe Java" dans la barre d’outils d’Android Studio.
  • Nommez cette classe «BaseActivity».
  • Cliquez sur OK."
  • Ouvrez BaseActivity et ajoutez les éléments suivants:

importer android.app.Activity; importer android.support.v4.app.ActivityCompat; importer android.support.v7.app.ActionBar; importer android.support.v7.app.AlertDialog; importer android.support.v7.app.AppCompatActivity; importer android.os.Bundle; importer android.content.DialogInterface; importer android.content.Intent; importer android.Manifest; importer android.provider.MediaStore; importer android.view.Menu; importer android.view.MenuItem; importer android.content.pm.PackageManager; importer android.net.Uri; importer android.provider.Settings; import android.support.annotation.NonNull; importer android.support.annotation.Nullable; importer java.io.File; Classe publique BaseActivity étend AppCompatActivity {public statique final int WRITE_STORAGE = 100; public static final int SELECT_PHOTO = 102; public static final String ACTION_BAR_TITLE = "action_bar_title"; photo d'archive publique; @Override protected void onCreate (@Nullable Bundle savedInstanceState) {super.onCreate (savedInstanceState); ActionBar actionBar = getSupportActionBar (); if (actionBar! = null) {actionBar.setDisplayHomeAsUpEnabled (true); actionBar.setTitle (getIntent (). getStringExtra (ACTION_BAR_TITLE)); }} @Override public boolean onCreateOptionsMenu (menu Menu) {getMenuInflater (). Inflate (R.menu.my_menu, menu); retourne vrai; } @Override public boolean onOptionsItemSelected (élément MenuItem) {switch (item.getItemId ()) {// Si «galerie_action» est sélectionné, alors ... // case R.id.gallery_action: //...check nous avons l'autorisation WRITE_STORAGE // checkPermission (WRITE_STORAGE); Pause; } return super.onOptionsItemSelected (item); } @Override public void onRequestPermissionsResult (int requestCode, autorisations @NonNull String, @NonNull int grantResults) {super.onRequestPermissionsResult (requestCode, autorisations, grantResults); switch (requestCode) {case WRITE_STORAGE: // Si la demande d'autorisation est accordée, alors ... // if (grantResults.length> 0 && grantResults == PackageManager.PERMISSION_GRANTED) {//...call selectPicture // selectPicture ( ) // Si la demande d'autorisation est refusée, alors ... //} else {//...d.afficher la chaîne «permission_request» // requestPermission (this, requestCode, R.string.permission_request); } Pause; }} // Affiche la boîte de dialogue de demande d'autorisation // publique statique void requestPermission (activité final, int int finalCode, msg) {AlertDialog.Builder alert = new AlertDialog.Builder (activity); alert.set (msg); alert.setPositiveButton (android.R.string.ok, nouvelle interface DialogInterface.OnClickListener () {@Override public void (Intérieure) .setData (Uri.parse ("package:" + activity.getPackageName ())); activity.startActivityForResult (permissonIntent, requestCode);}}); alert.setNegativeButton (android.R.string.cancel, nouvelle DialogInterface.OnClickListener () {@Override public void onClick (DialogInterface dialogInterface, int i) {dialogInterface.dismiss ();}}); alert.setCancelable (false); alert.show (); } // Vérifie si l'utilisateur a accordé l'autorisation WRITE_STORAGE // public void checkPermission (int requestCode) {switch (requestCode) {case WRITE_STORAGE: int hasWriteExternalStoragePermission = ActivityCompat.checkSelfPermission (this, Manifest.permission.WRITE_EXTERNAL_STORAGE); // Si nous avons accès au stockage externe ... // if (hasWriteExternalStoragePermission == PackageManager.PERMISSION_GRANTED) {//...call selectPicture, qui lance une activité dans laquelle l'utilisateur peut sélectionner une image // selectPicture (); // Si l'autorisation n'a pas été accordée, alors ... //} else {//... demander l'autorisation // ActivityCompat.requestPermissions (this, new String {Manifest.permission.WRITE_EXTERNAL_STORAGE}, requestCode); } Pause; }} private void selectPicture () {photo = MyHelper.createTempFile (photo); Intention Intention = nouvelle Intention (Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); // Démarrer une activité où l'utilisateur peut choisir une image // startActivityForResult (intent, SELECT_PHOTO); }}

À ce stade, votre projet doit se plaindre de ne pas pouvoir résoudre MyHelper.createTempFile. Implémentons ceci maintenant!

Redimensionnement des images avec createTempFile

Créez une nouvelle classe “MyHelper”. Dans cette classe, nous allons redimensionner l’image choisie par l’utilisateur, prête à être traitée par l’API de reconnaissance de texte.

importer android.graphics.Bitmap; importer android.graphics.BitmapFactory; importer android.content.Context; importer android.database.Cursor; importer android.os.Environment; importer android.widget.ImageView; importer android.provider.MediaStore; importer android.net.Uri; importer static android.graphics.BitmapFactory.decodeFile; importer statique android.graphics.BitmapFactory.decodeStream; importer java.io.File; importer java.io.FileNotFoundException; importer java.io.FileOutputStream; importer java.io.IOException; Classe publique MyHelper {String statique publique getPath (contexte de contexte, Uri uri) {String path = ""; Projection de chaîne = {MediaStore.Images.Media.DATA}; Curseur curseur = context.getContentResolver (). Query (uri, projection, null, null, null); int column_index; if (cursor! = null) {index_colonne = cursor.getColumnIndexOrThrow (MediaStore.Images.Media.DATA); curseur.moveToFirst (); chemin = curseur.getString (index_colonne); curseur.close (); } chemin de retour; } Fichier statique public createTempFile (fichier fichier) {répertoire de fichiers = nouveau fichier (Environment.getExternalStorageDirectory (). getPath () + "/com.jessicathornsby.myapplication"); if (! directory.exists () ||! directory.isDirectory ()) {directory.mkdirs (); } if (fichier == null) {fichier = nouveau Fichier (répertoire, "orig.jpg"); } fichier de retour; } public static Bitmap resizePhoto (Fichier imageFile, contexte, Uri uri, vue ImageView) {BitmapFactory.Options newOptions = new BitmapFactory.Options (); try {decodeStream (context.getContentResolver (). openInputStream (uri), null, newOptions); int photoHeight = newOptions.outHeight; int photoWidth = newOptions.outWidth; newOptions.inSampleSize = Math.min (photoWidth / view.getWidth (), photoHeight / view.getHeight ()); renvoyer compressPhoto (imageFile, BitmapFactory.decodeStream (context.getContentResolver (). openInputStream (uri), null, newOptions)); } catch (exception FileNotFoundException) {exception.printStackTrace (); return null; }} public static Bitmap resizePhoto (Fichier imageFile, chemin de chaîne, vue ImageView) {BitmapFactory.Options options = new BitmapFactory.Options (); decodeFile (chemin d'accès, options); int photoHeight = options.outHeight; int photoWidth = options.outWidth; options.inSampleSize = Math.min (photoWidth / view.getWidth (), photoHeight / view.getHeight ()); return compressPhoto (imageFile, BitmapFactory.decodeFile (chemin d'accès, options)); } statique statique Bitmap compressPhoto (fichier photoFile, bitmap bitmap) {try {FileOutputStream fOutput = new FileOutputStream (photoFile); bitmap.compress (Bitmap.CompressFormat.JPEG, 70, fOutput); fOutput.close (); } catch (exception IOException) {exception.printStackTrace (); } return bitmap; }}

Définir l'image sur un ImageView

Ensuite, nous devons implémenter onActivityResult () dans notre classe MainActivity et définir l’image choisie par l’utilisateur sur notre ImageView.

importer android.graphics.Bitmap; importer android.os.Bundle; importer android.widget.ImageView; importer android.content.Intent; importer android.widget.TextView; importer android.net.Uri; Classe publique MainActivity étend BaseActivity {private Bitmap myBitmap; ImageView privé myImageView; TextView privé myTextView; @Override protected void onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); myTextView = findViewById (R.id.textView); myImageView = findViewById (R.id.imageView); } @Override protected void onActivityResult (int requestCode, int resultCode, données d'intention) {super.onActivityResult (requestCode, resultCode, data); if (resultCode == RESULT_OK) {switch (requestCode) {case WRITE_STORAGE: checkPermission (requestCode); Pause; case SELECT_PHOTO: Uri dataUri = data.getData (); Chemin de la chaîne = MyHelper.getPath (this, dataUri); if (path == null) {myBitmap = MyHelper.resizePhoto (photo, this, dataUri, myImageView); } else {myBitmap = MyHelper.resizePhoto (photo, chemin d'accès, myImageView); } if (myBitmap! = null) {myTextView.setText (null); myImageView.setImageBitmap (myBitmap); } Pause; }}}}

Exécutez ce projet sur un périphérique Android physique ou AVD, puis cliquez sur l'icône de la barre d'action. Lorsque vous y êtes invité, accordez l'autorisation WRITE_STORAGE et choisissez une image dans la galerie. cette image devrait maintenant être affichée dans l'interface utilisateur de votre application.

Maintenant que nous avons jeté les bases, nous sommes prêts à commencer à extraire du texte!

Apprendre à une application à reconnaître le texte

Je veux déclencher la reconnaissance de texte en réponse à un événement click, nous devons donc implémenter un OnClickListener:

importer android.graphics.Bitmap; importer android.os.Bundle; importer android.widget.ImageView; importer android.content.Intent; importer android.widget.TextView; importer android.view.View; importer android.net.Uri; Classe publique MainActivity étend BaseActivity implémente View.OnClickListener {private Bitmap myBitmap; ImageView privé myImageView; TextView privé myTextView; @Override protected void onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); myTextView = findViewById (R.id.textView); myImageView = findViewById (R.id.imageView); findViewById (R.id.checkText) .setOnClickListener (this); } @Override public void onClick (View View) {switch (view.getId ()) {case R.id.checkText: if (myBitmap! = Null) {// Nous allons implémenter runTextRecog à l'étape suivante // runTextRecog (); } Pause; }}

ML Kit ne peut traiter les images que si elles sont au format FirebaseVisionImage. Nous devons donc convertir notre image en objet FirebaseVisionImage. Vous pouvez créer une FirebaseVisionImage à partir d'un tableau Bitmap, media.Image, ByteBuffer ou d'octets. Puisque nous travaillons avec des bitmaps, nous devons appeler la méthode de l’utilitaire fromBitmap () de la classe FirebaseVisionImage et lui transmettre notre bitmap.

private void runTextRecog () {FirebaseVisionImage image = FirebaseVisionImage.fromBitmap (myBitmap);

ML Kit a différentes classes de détecteurs pour chacune de ses opérations de reconnaissance d’image. Pour le texte, nous devons utiliser la classe FirebaseVisionTextDetector, qui effectue la reconnaissance optique de caractères (OCR) sur une image.

Nous créons une instance de FirebaseVisionTextDetector, en utilisant getVisionTextDetector:

Détecteur FirebaseVisionTextDetector = FirebaseVision.getInstance (). GetVisionTextDetector ();

Ensuite, nous devons vérifier le texte de FirebaseVisionImage en appelant la méthode detectInImage () et en lui transmettant l'objet FirebaseVisionImage. Nous devons également implémenter les callbacks onSuccess et onFailure, ainsi que les écouteurs correspondants, afin que notre application soit avertie dès que les résultats sont disponibles.

detector.detectInImage (image) .addOnSuccessListener (nouveau OnSuccessListener() {@Override // À faire //}}). AddOnFailureListener (new OnFailureListener () {@Override public void onFailure (@NonNull Exception exception) {// La tâche a échoué avec une exception //}}); }

Si cette opération échoue, je vais afficher un toast, mais si l'opération réussit, j'appellerai processExtreasedText avec la réponse.

À ce stade, mon code de détection de texte ressemble à ceci:

// Créer une FirebaseVisionImage // Void privé runTextRecog () {FirebaseVisionImage image = FirebaseVisionImage.fromBitmap (myBitmap); // Créer une instance de FirebaseVisionCloudTextDetector // FirebaseVisionTextDetector détecteur = FirebaseVision.getInstance (). GetVisionTextDetector (); // Enregistre un OnSuccessListener // detect.detectInImage (image) .addOnSuccessListener (nouveau OnSuccessListener() {@Override // Implémente le rappel onSuccess // annulation publique onSuccess (textes FirebaseVisionText) {// Appelez processExtreatedText avec la réponse // processExtreatedText (textes); }}). addOnFailureListener (new OnFailureListener () {@Override // Implémenter le calquage onFailure // public void onFailure (@NonNull Exception exception) {Toast.makeText (MainActivity.this, "Exception", Toast.LENGTH_LONG) .show ( );}}); }

Chaque fois que notre application reçoit une notification onSuccess, nous devons analyser les résultats.

Un objet FirebaseVisionText peut contenir des éléments, des lignes et des blocs, chaque bloc équivalant généralement à un seul paragraphe de texte. Si FirebaseVisionText renvoie 0 bloc, nous afficherons la chaîne «no_text», mais si elle contient un ou plusieurs blocs, nous affichons le texte récupéré dans le cadre de notre TextView.

private void processExtreatedText (FirebaseVisionText firebaseVisionText) {myTextView.setText (null); if (firebaseVisionText.getBlocks (). size () == 0) {myTextView.setText (R.string.no_text); revenir; } pour (bloc FirebaseVisionText.Block: firebaseVisionText.getBlocks ()) {myTextView.append (block.getText ()); }}}

Voici le code MainActivity complété:

importer android.graphics.Bitmap; importer android.os.Bundle; importer android.widget.ImageView; importer android.content.Intent; importer android.widget.TextView; importer android.widget.Toast; importer android.view.View; importer android.net.Uri; import android.support.annotation.NonNull; importer com.google.firebase.ml.vision.common.FirebaseVisionImage; import com.google.firebase.ml.vision.text.FirebaseVisionText; import com.google.firebase.ml.vision.text.FirebaseVisionTextDetector; importer com.google.firebase.ml.vision.FirebaseVision; importer com.google.android.gms.tasks.OnSuccessListener; importer com.google.android.gms.tasks.OnFailureListener; Classe publique MainActivity étend BaseActivity implémente View.OnClickListener {private Bitmap myBitmap; ImageView privé myImageView; TextView privé myTextView; @Override protected void onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); myTextView = findViewById (R.id.textView); myImageView = findViewById (R.id.imageView); findViewById (R.id.checkText) .setOnClickListener (this); } @Override public void onClick (View View) {switch (view.getId ()) {case R.id.checkText: if (myBitmap! = Null) {runTextRecog (); } Pause; }} @Override protected void onActivityResult (int requestCode, int resultCode, Intent data) {super.onActivityResult (requestCode, resultCode, data); if (resultCode == RESULT_OK) {switch (requestCode) {case WRITE_STORAGE: checkPermission (requestCode); Pause; case SELECT_PHOTO: Uri dataUri = data.getData (); Chemin de la chaîne = MyHelper.getPath (this, dataUri); if (path == null) {myBitmap = MyHelper.resizePhoto (photo, this, dataUri, myImageView); } else {myBitmap = MyHelper.resizePhoto (photo, chemin d'accès, myImageView); } if (myBitmap! = null) {myTextView.setText (null); myImageView.setImageBitmap (myBitmap); } Pause; }}} private void runTextRecog () {FirebaseVisionImage image = FirebaseVisionImage.fromBitmap (myBitmap); Détecteur FirebaseVisionTextDetector = FirebaseVision.getInstance (). GetVisionTextDetector (); detector.detectInImage (image) .addOnSuccessListener (nouveau OnSuccessListener() {@Override public void onSuccess (textes FirebaseVisionText) {processExtractedText (textes); }}). addOnFailureListener (new OnFailureListener () {@Override public void onFailure (@NonNull Exception exception) {Toast.makeText (MainActivity.this, "Exception", Toast.LENGTH_LONG) .show ();}}); } private void processExtreatedText (FirebaseVisionText firebaseVisionText) {myTextView.setText (null); if (firebaseVisionText.getBlocks (). size () == 0) {myTextView.setText (R.string.no_text); revenir; } pour (bloc FirebaseVisionText.Block: firebaseVisionText.getBlocks ()) {myTextView.append (block.getText ()); }}}

Tester le projet

Il est maintenant temps de voir la reconnaissance de texte de ML Kit en action! Installez ce projet sur un appareil Android ou AVD, choisissez une image dans la galerie, puis cliquez sur le bouton «Vérifier le texte». L'application doit répondre en extrayant tout le texte de l'image, puis en l'affichant dans un TextView.

Notez que selon la taille de votre image et la quantité de texte qu'elle contient, vous devrez peut-être faire défiler l'écran pour voir tout le texte extrait.

Vous pouvez également télécharger le projet terminé à partir de GitHub.

Emballer

Vous savez maintenant comment détecter et extraire le texte d'une image à l'aide de ML Kit.

L'API de reconnaissance de texte n'est qu'un élément du kit ML. Ce kit SDK propose également la numérisation de codes à barres, la détection des visages, l'étiquetage d'images et la reconnaissance de points de repère. Il est prévu d'ajouter davantage d'API pour les cas d'utilisation mobiles courants, y compris Smart Reply et une API de contour du visage haute densité.

Quelle API de Kit ML êtes-vous le plus intéressé à essayer? Faites-nous savoir dans les commentaires ci-dessous!

Huawei pae un mauvai moment. Vou ne le auriez pa en regardant le Mate 30 Pro, un kit étincelant qui repire le luxe et la technologie de pointe. Mai enuite, vou déverrouillez le télé...

Une de plu grande plainte avec martwatche moderne et la vie de la batterie. Par exemple, i vou achetez quelque choe utiliant Google Wear O, vou ne pouvez généralement vou attendre à ce ...

Assurez-Vous De Lire