Cum să extrageți text din imagini cu SDK-ul Machine Learning Google

Autor: John Stephens
Data Creației: 27 Ianuarie 2021
Data Actualizării: 2 Iulie 2024
Anonim
What’s new in Android machine learning (Google I/O’19)
Video: What’s new in Android machine learning (Google I/O’19)

Conţinut


De asemenea, puteți utiliza API-ul de recunoaștere a textului ca bază pentru aplicații de traducere sau servicii de accesibilitate în care utilizatorul își poate îndrepta camera la orice text cu care se luptă și le poate citi cu voce tare.

În acest tutorial, vom pune bazele pentru o gamă largă de funcții inovatoare, prin crearea unei aplicații care poate extrage text din orice imagine din galeria utilizatorului. Deși nu îl vom cuprinde în acest tutorial, puteți capta text și din împrejurimile utilizatorului în timp real, conectând această aplicație la camera foto a dispozitivului.

Pe dispozitiv sau în nor?

Unele dintre API-urile ML Kit sunt disponibile doar pe dispozitiv, dar câteva sunt disponibile pe dispozitiv și în cloud, inclusiv API Recunoașterea textului.

API-ul Text pe bază de cloud poate identifica o gamă mai largă de limbi și caractere și promite o precizie mai mare decât omologul său de pe dispozitiv. Cu toate acestea face necesită o conexiune la Internet activă și este disponibil numai pentru proiectele la nivel Blaze.


În acest articol, vom rula API-ul de recunoaștere a textului la nivel local, astfel încât să puteți urmări indiferent dacă ați făcut upgrade la Blaze sau sunteți în planul gratuit pentru Firebase Spark.

Crearea unei aplicații de recunoaștere a textului cu ML Kit

Creați o aplicație cu setările la alegere, dar atunci când vi se solicită, selectați șablonul „Activitate goală”.

ML Kit SDK face parte din Firebase, așa că va trebui să conectați proiectul la Firebase, folosind certificatul său de semnare SHA-1. Pentru a obține SHA-1 al proiectului:

  • Selectați fila „Gradle” din Android Studio.
  • În panoul „Proiecte Gradle”, faceți dublu clic pentru a extinde „rădăcina” proiectului dvs., apoi selectați „Sarcini> Android> Raport de semnare”.
  • Panoul din partea de jos a ferestrei Android Studio ar trebui să se actualizeze pentru a afișa câteva informații despre acest proiect - inclusiv certificatul său de semnare SHA-1.


Pentru a conecta proiectul la Firebase:

  • În browserul dvs. web, lansați Firebase Console.
  • Selectați „Adăugați proiect”.
  • Denumiți proiectului dvs. un nume; Folosesc „Testul ML”.
  • Citiți termenii și condițiile și dacă sunteți fericit să continuați, atunci selectați „Accept…” urmată de „Creare proiect”.
  • Selectați „Adăugați Firebase în aplicația dvs. Android”.
  • Introduceți numele pachetului proiectului dvs., pe care îl veți găsi în partea de sus a fișierului MainActivity și în Manifest.
  • Introduceți certificatul de semnare SHA-1 al proiectului.
  • Faceți clic pe „Înregistrați aplicația”.
  • Selectați „Descărcați google-services.json.” Acest fișier conține toate metadatele Firebase necesare pentru proiectul dvs., inclusiv cheia API.
  • În Android Studio, trageți și plasați fișierul google-services.json în directorul „aplicației” al proiectului.

  • Deschideți fișierul build.gradle la nivel de proiect și adăugați calea de servicii Google:

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

  • Deschideți fișierul build.gradle la nivel de aplicație și adăugați dependențe pentru Firebase Core, Firebase ML Vision și interpretul modelului, plus pluginul pentru servicii Google:

aplicați plugin: com.google.gms.google-services ... ... ... dependențe {fișier de implementare Tree (dir: libs, include:) implementare com.google.firebase: firebase-core: 16.0.1 implementare com. google.firebase: firebase-ml-vision: 16.0.0 implementare com.google.firebase: firebase-ml-model-interpret: 16.0.0

În acest moment, va trebui să rulați proiectul pentru a se putea conecta la serverele Firebase:

  • Instalați aplicația fie pe un smartphone sau tabletă Android fizic, fie pe un dispozitiv virtual Android (AVD).
  • În Consola Firebase, selectați „Rulați aplicația pentru a verifica instalarea.”
  • După câteva momente, ar trebui să vedeți un „Felicitări”; selectați „Continuați la consolă”.

Descărcați modelele Google de învățare automată pre-instruite

În mod implicit, ML Kit descarcă doar modele atunci când este nevoie, astfel încât aplicația noastră va descărca modelul OCR atunci când utilizatorul încearcă să extragă text pentru prima dată.

Acest lucru ar putea avea un impact negativ asupra experienței utilizatorului - imaginați-vă că încercați să accesați o caracteristică, numai pentru a descoperi că aplicația trebuie să descarce mai multe resurse înainte de a putea efectua această funcție. În cel mai rău caz, este posibil ca aplicația dvs. să nu poată descărca resursele de care are nevoie, de exemplu, dacă dispozitivul nu are conexiune la Internet.

Pentru a vă asigura că acest lucru nu se va întâmpla cu aplicația noastră, voi descărca modelul OCR necesar la momentul instalării, care necesită unele modificări la Maniest.

În timp ce manifestul este deschis, voi adăuga și permisiunea WRITE_EXTERNAL_STORAGE, pe care o vom folosi ulterior în acest tutorial.

// Adăugați permisiunea WRITE_EXTERNAL_STORAGE // // Adăugați următoarele //

Construirea machetei

Să eliminăm lucrurile ușoare și să creăm un aspect format din:

  • Un ImageView. Inițial, aceasta va afișa un marcator de locație, dar se va actualiza după ce utilizatorul selectează o imagine din galeria sa.
  • Un buton, care declanșează extragerea textului.
  • Un TextView, unde vom afișa textul extras.
  • Un ScrollView. Întrucât nu există nicio garanție, textul extras nu se va potrivi perfect pe ecran, voi plasa TextView în interiorul unui ScrollView.

Iată fișierul finalizat activ_main.xml:

Această structură face referire la un desen „ic_placeholder”, deci creăm acest lucru acum:

  • Selectați „File> New> Image Asset” din bara de instrumente Android Studio.
  • Deschideți pictograma „Tip pictogramă” și selectați „Bare de acțiune și pictograme pentru fila”.
  • Asigurați-vă că este selectat butonul radio „Clip Art”.
  • Dați clic pe butonul „Clip Art”.
  • Selectați imaginea pe care doriți să o utilizați ca deținător de locație; Folosesc „Adaugă la fotografii”.
  • Faceți clic pe „OK”.
  • Deschideți funcția verticală „Tema” și selectați „HOLO_LIGHT”.
  • În câmpul „Nume”, introduceți „ic_placeholder”.
  • Faceți clic pe „Următorul”. Citiți informațiile și dacă sunteți încântat să continuați, faceți clic pe „Finalizați”.

Pictograme de bare de acțiune: Lansarea aplicației Galerie

În continuare, voi crea un element de bare de acțiune care va lansa galeria utilizatorului, gata pentru a selecta o imagine.

Definiți pictogramele barei de acțiune dintr-un fișier de resurse din meniu, care se află în directorul „res / meniu”. Dacă proiectul dvs. nu conține acest director, atunci va trebui să îl creați:

  • Faceți clic pe directorul „res” al proiectului dvs. și selectați „Nou> Director resurse Android”.
  • Deschideți meniul derulant „Tip resurse” și selectați „meniu”
  • „Numele directorului” ar trebui să se actualizeze automat la „meniu”, dar dacă nu va fi necesar, va trebui să îl redenumiți manual.
  • Faceți clic pe „OK”.

Acum sunteți gata să creați fișierul de resurse din meniu:

  • Faceți clic pe directorul „meniu” al proiectului și selectați „Nou> Fișier resursă meniu”.
  • Denumiți acest fișier „my_menu”.
  • Faceți clic pe „OK”.
  • Deschideți fișierul „my_menu.xml” și adăugați următoarele:

//Creaza un element pentru fiecare acțiune //

Fișierul de meniu face referire la un șir „action_gallery”, așadar deschideți fișierul res / valori / strings.xml al proiectului și creați această resursă. În timp ce sunt aici, definesc și celelalte șiruri pe care le vom folosi pe parcursul acestui proiect.

Galerie Această aplicație trebuie să acceseze fișierele de pe dispozitiv. Nu a fost găsit niciun text

Apoi, utilizați Image Asset Studio pentru a crea pictograma „ic_gallery” a barei de acțiuni:

  • Selectați „File> New> Image Asset.”
  • Setați pictograma „Tip pictogramă” pe „Icoane cu bara de acțiune și tab”
  • Faceți clic pe butonul „Clip Art”.
  • Alege un desenabil; Folosesc „imagine”.
  • Faceți clic pe „OK”.
  • Pentru a vă asigura că această pictogramă este vizibilă în bara de acțiuni, deschideți pictograma „Tema” și selectați „HOLO_DARK”.
  • Denumiți această pictogramă „ic_gallery”.
  • Faceți clic pe „Următorul”, urmată de „Finalizare”.

Gestionarea cererilor de permisiuni și a evenimentelor de clic

Voi îndeplini toate sarcinile care nu sunt direct legate de API-ul de recunoaștere a textului într-o clasă BaseActivity separată, inclusiv instantarea meniului, gestionarea evenimentelor de clicuri pe bara de acțiune și solicitarea accesului la stocarea dispozitivului.

  • Selectați „File> New> Java class” din bara de instrumente a Android Studio.
  • Denumiți această clasă „BaseActivity”.
  • Faceți clic pe „OK”.
  • Deschideți BaseActivity și adăugați următoarele:

import Android.app.Activitate; import android.support.v4.app.ActivityCompat; import android.support.v7.app.ActionBar; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import Android.os.Bundle; import android.content.DialogInterface; import android.content.Intent; import Android.Manifest; import Android.provider.MediaStore; import Android.view.Menu; import Android.view.MenuItem; import android.content.pm.PackageManager; import Android.net.Uri; import android.provider.Settings; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import java.io.File; public class BaseActivity extinde AppCompatActivity {public static final int WRITE_STORAGE = 100; public static final int SELECT_PHOTO = 102; public static final String ACTION_BAR_TITLE = "action_bar_title"; fotografie de fișier public; @ Supraveghează vidul protejat onCreate (@Nullable Bundle savedInstanceState) {super.onCreate (salvatInstanceState); ActionBar actionBar = getSupportActionBar (); if (actionBar! = null) {actionBar.setDisplayHomeAsUpEnabled (adevărat); actionBar.setTitle (getIntent () getStringExtra (ACTION_BAR_TITLE).); }} @ Supraveghează publicul boolean onCreateOptionsMenu (meniul meniu) {getMenuInflater (). Inflate (R.menu.my_menu, meniu); întoarce-te adevărat; } @Overidire publică booleană onOptionsItemSelected (element MenuItem) {switch (item.getItemId ()) {// Dacă este selectată „gallery_action”, atunci ... // cazul R.id.gallery_action: //...check avem permisiunea WRITE_STORAGE // checkPermission (WRITE_STORAGE); pauză; } returnare super.onOptionsItemSelected (element); } @Overidire public void onRequestPermissionsResult (int requestCode, @NonNull String permissions, @NonNull int grantResults) {super.onRequestPermissionsResult (requestCode, permissions, grantResults); switch (requestCode) {case WRITE_STORAGE: // Dacă se solicită permisiunea, atunci ... // if (grantResults.length> 0 && grantResults == PackageManager.PERMISSION_GRANTED) {//...call selectPicture // selectPicture ( ); // Dacă solicitarea de permisiune este refuzată, atunci ... //} altfel {//...dispunde șirul „permission_request” // requestPermission (aceasta, requestCode, R.string.permission_request); } pauză; }} // Afișați dialogul de solicitare a permisiunii // public static void requestPermission (activitate finală a activității, cerere int finalCode, int msg) {AlertDialog.Builder alert = new AlertDialog.Builder (activitate); alert.set (msg); alert.setPositiveButton (android.R.string.ok, nou DialogInterface.OnClickListener () {@Override public void onClick (DialogInterface dialogInterface, int i) {dialogInterface.dismiss (); .setData (Uri.parse ("pachet:" + activitate.getPackageName ()); activitate.startActivityForResult (permissonIntent, requestCode);}}); alert.setNegativeButton (android.R.string.cancel, noua DialogInterface.OnClickListener () {@Override public void onClick (DialogInterface dialogInterface, int i) {dialogInterface.dismiss ();}}); alert.setCancelable (false); alert.show (); } // Verificați dacă utilizatorul a acordat permisiunea WRITE_STORAGE // public void checkPermission (int requestCode) {switch (requestCode) {case WRITE_STORAGE: int hasWriteExternalStoragePermission = ActivityCompat.checkSelfPermission (aceasta, Manifest.permission.WRITE_EXTERNAL_STORAGE); // Dacă avem acces la stocarea externă ... // if (hasWriteExternalStoragePermission == PackageManager.PERMISSION_GRANTED) {//...call selectPicture, care lansează o activitate în care utilizatorul poate selecta o imagine // selectPicture (); // Dacă nu s-a acordat permisiunea, atunci ... //} altfel {//... solicitați permisiunea // ActivityCompat.requestPermissions (aceasta, noua șir {Manifest.permission.WRITE_EXTERNAL_STORAGE}, requestCode); } pauză; }} private void selectPicture () {photo = MyHelper.createTempFile (foto); Intent intent = new Intent (Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); // Porniți o activitate în care utilizatorul poate alege o imagine // startActivityForResult (intenție, SELECT_PHOTO); }}

În acest moment, proiectul dvs. ar trebui să se plângă că nu poate rezolva MyHelper.createTempFile. Să implementăm acest lucru acum!

Redimensionarea imaginilor cu createTempFile

Creați o nouă clasă „MyHelper”. În această clasă, vom redimensiona imaginea aleasă de utilizator, gata de a fi procesată de API Recunoașterea textului.

import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.content.Context; import android.database.Cursor; import android.os.Environnement; import Android.widget.ImageView; import Android.provider.MediaStore; import Android.net.Uri; import static.graphics.BitmapFactory.decodeFile; import static.graphics.BitmapFactory.decodeStream static; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class MyHelper {public static String getPath (Context context, Uri uri) {String path = ""; String projection = {MediaStore.Images.Media.DATA}; Cursor cursor = context.getContentResolver (). Interogare (uri, proiecție, nul, nul, nul); int column_index; if (cursor! = null) {column_index = cursor.getColumnIndexOrThrow (MediaStore.Images.Media.DATA); cursor.moveToFirst (); path = cursor.getString (column_index); cursor.close (); } calea de intoarcere; } public static File createTempFile (File file) {Directory file = new File (Environment.getExternalStorageDirectory (). getPath () + "/com.jessicathornsby.myapplication"); if (! directory.exists () ||! directory.isDirectory ()) {directory.mkdirs (); } if (file == null) {file = new File (director, "orig.jpg"); } dosar retur; } public static Bitmap resizePhoto (fișier imagineFile, context contextual, Uri uri, vizualizare ImageView) {BitmapFactory.Options newOptions = new BitmapFactory.Options (); încercați {decodeStream (context.getContentResolver (). openInputStream (uri), nul, newOptions); int photoHeight = newOptions.outHeight; int photoWidth = newOptions.outWidth; newOptions.inSampleSize = Math.min (photoWidth / view.getWidth (), photoHeight / view.getHeight ()); return compressPhoto (imageFile, BitmapFactory.decodeStream (context.getContentResolver (). openInputStream (uri), nul, newOptions)); } catch (excepție FileNotFoundException) {exception.printStackTrace (); returnare nulă; }} public static Bitmap resizePhoto (File imageFile, String path, View ImageView) {BitmapFactory.Options options = new BitmapFactory.Options (); decodeFile (cale, opțiuni); int photoHeight = options.outHeight; int photoWidth = options.outWidth; options.inSampleSize = Math.min (photoWidth / view.getWidth (), photoHeight / view.getHeight ()); return compressPhoto (imageFile, BitmapFactory.decodeFile (cale, opțiuni)); } privat static Bitmap compressPhoto (File PhotoFile, Bitmap bitmap) {try {FileOutputStream fOutput = new FileOutputStream (photoFile); bitmap.compress (Bitmap.CompressFormat.JPEG, 70, fOutput); fOutput.close (); } captură (excepție IOException) {exception.printStackTrace (); } return bitmap; }}

Setați imaginea la ImageView

În continuare, trebuie să implementăm onActivityResult () în clasa noastră MainActivity și să setăm imaginea aleasă de utilizator pentru ImageView.

import android.graphics.Bitmap; import Android.os.Bundle; import Android.widget.ImageView; import android.content.Intent; import Android.widget.TextView; import Android.net.Uri; public class MainActivity extinde BaseActivity {private Bitmap myBitmap; privat ImageView myImageView; privat TextView myTextView; @Override protected void onCreate (Bundle savedInstanceState) {super.onCreate (salvatInstanceState); setContentView (R.layout.activity_main); myTextView = findViewById (R.id.textView); myImageView = findViewById (R.id.imageView); } @ Supraveghează vidul protejat onActivityResult (int requestCode, int resultCode, Intent data) {super.onActivityResult (requestCode, resultCode, data); if (resultCode == RESULT_OK) {switch (requestCode) {case WRITE_STORAGE: checkPermission (requestCode); pauză; cazul SELECT_PHOTO: Uri dataUri = data.getData (); String path = MyHelper.getPath (aceasta, dataUri); if (path == null) {myBitmap = MyHelper.resizePhoto (fotografie, aceasta, dataUri, myImageView); } else {myBitmap = MyHelper.resizePhoto (fotografie, cale, myImageView); } if (myBitmap! = null) {myTextView.setText (null); myImageView.setImageBitmap (myBitmap); } pauză; }}}}}

Rulați acest proiect pe un dispozitiv Android sau AVD fizic și dați clic pe pictograma barei de acțiune. Când vi se solicită, acordați permisiunea WRITE_STORAGE și alegeți o imagine din galerie; această imagine ar trebui să fie afișată acum în interfața de utilizare a aplicației dvs.

Acum am pus bazele, suntem gata să începem să extragem text!

Predarea unei aplicații să recunoască textul

Doresc să declanșez recunoașterea textului ca răspuns la un eveniment de clic, deci trebuie să implementăm un OnClickListener:

import android.graphics.Bitmap; import Android.os.Bundle; import Android.widget.ImageView; import android.content.Intent; import Android.widget.TextView; import Android.view.View; import Android.net.Uri; public class MainActivity extinde BaseActivity implementează View.OnClickListener {private Bitmap myBitmap; privat ImageView myImageView; privat TextView myTextView; @Override protected void onCreate (Bundle savedInstanceState) {super.onCreate (salvatInstanceState); setContentView (R.layout.activity_main); myTextView = findViewById (R.id.textView); myImageView = findViewById (R.id.imageView); findViewById (R.id.checkText) .setOnClickListener (aceasta); } @Supune public void onClick (View view) {switch (view.getId ()) {case R.id.checkText: if (myBitmap! = Null) {// Vom implementa runTextRecog în pasul următor // runTextRecog (); } pauză; }}

Kitul ML poate prelucra imaginile doar atunci când sunt în format FirebaseVisionImage, de aceea trebuie să ne transformăm imaginea într-un obiect FirebaseVisionImage. Puteți crea un FirebaseVisionImage dintr-un Bitmap, media.Image, ByteBuffer sau un tablou de octeți. Deoarece lucrăm cu Bitmaps, trebuie să apelăm la metoda utilitară fromBitmap () din clasa FirebaseVisionImage și să o transmitem Bitmap.

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

ML Kit are clase de detector diferite pentru fiecare dintre operațiunile sale de recunoaștere a imaginii. Pentru text, trebuie să utilizăm clasa FirebaseVisionTextDetector, care realizează recunoașterea optică a caracterelor (OCR) pe o imagine.

Creăm o instanță a FirebaseVisionTextDetector, folosind getVisionTextDetector:

FirebaseVisionTextDetector detector = FirebaseVision.getInstance (). GetVisionTextDetector ();

În continuare, trebuie să verificăm textul FirebaseVisionImage, apelând la metoda detectareInImage () și trecând-o pe obiectul FirebaseVisionImage. De asemenea, trebuie să implementăm apeluri onSuccess și onFailure, plus ascultători corespunzători, astfel încât aplicația noastră să fie notificată ori de câte ori rezultatele devin disponibile.

detector.detectInImage (imagine) .addOnSuccessListener (nou OnSuccessListener() {@Override // To do //}}). AddOnFailureListener (nou OnFailureListener () {@Override public void onFailure (excepție @NonNull Excepție) {// Sarcina a eșuat cu o excepție //}}); }

Dacă această operație nu reușește, atunci voi afișa un toast, dar dacă operațiunea va avea succes, voi apela processExtractedText cu răspunsul.

În acest moment, codul meu de detectare a textului arată astfel:

// Creați un FirebaseVisionImage // private void runTextRecog () {FirebaseVisionImage image = FirebaseVisionImage.fromBitmap (myBitmap); // Creați o instanță de FirebaseVisionCloudTextDetector // FirebaseVisionTextDetector detector = FirebaseVision.getInstance (). GetVisionTextDetector (); // Înregistrați un OnSuccessListener // detector.detectInImage (imagine) .addOnSuccessListener (nou OnSuccessListener() {@Override // Implementați apelul onSuccess // public void onSuccess (texte FirebaseVisionText) {// Apelare procesExtractedText cu răspunsul // processExtractedText (texte); }}). addOnFailureListener (nou OnFailureListener () {@Override // Implementați calearea onFailure // public void onFailure (excepție @NonNull Exception) {Toast.makeText (MainActivity.this, "Excepție", Toast.LENGTH_LONG. );}}); }

Ori de câte ori aplicația noastră primește o notificare onSuccess, trebuie să analizăm rezultatele.

Un obiect FirebaseVisionText poate conține elemente, linii și blocuri, unde fiecare bloc echivalează de obicei cu un singur paragraf de text. Dacă FirebaseVisionText returnează 0 blocuri, atunci vom afișa șirul „no_text”, dar dacă conține unul sau mai multe blocuri, atunci vom afișa textul preluat ca parte a TextView.

private void processExtractedText (FirebaseVisionText firebaseVisionText) {myTextView.setText (null); if (firebaseVisionText.getBlocks (). size () == 0) {myTextView.setText (R.string.no_text); întoarcere; } pentru (FirebaseVisionText.Block bloc: firebaseVisionText.getBlocks ()) {myTextView.append (block.getText ()); }}}

Iată codul MainActivity completat:

import android.graphics.Bitmap; import Android.os.Bundle; import Android.widget.ImageView; import android.content.Intent; import Android.widget.TextView; import Android.widget.Toast; import Android.view.View; import Android.net.Uri; import android.support.annotation.NonNull; import com.google.firebase.ml.vision.common.FirebaseVisionImage; import com.google.firebase.ml.vision.text.FirebaseVisionText; import com.google.firebase.ml.vision.text.FirebaseVisionTextDetector; import com.google.firebase.ml.vision.FirebaseVision; import com.google.android.gms.tasks.OnSuccessListener; import com.google.android.gms.tasks.OnFailureListener; public class MainActivity extinde BaseActivity implementează View.OnClickListener {private Bitmap myBitmap; privat ImageView myImageView; privat TextView myTextView; @Override protected void onCreate (Bundle savedInstanceState) {super.onCreate (salvatInstanceState); setContentView (R.layout.activity_main); myTextView = findViewById (R.id.textView); myImageView = findViewById (R.id.imageView); findViewById (R.id.checkText) .setOnClickListener (aceasta); } @Supune public void onClick (View view) {switch (view.getId ()) {case R.id.checkText: if (myBitmap! = Null) {runTextRecog (); } pauză; }} @Overidere protejat void onActivityResult (int requestCode, int resultCode, Intent data) {super.onActivityResult (requestCode, resultCode, data); if (resultCode == RESULT_OK) {switch (requestCode) {case WRITE_STORAGE: checkPermission (requestCode); pauză; cazul SELECT_PHOTO: Uri dataUri = data.getData (); String path = MyHelper.getPath (aceasta, dataUri); if (path == null) {myBitmap = MyHelper.resizePhoto (fotografie, aceasta, dataUri, myImageView); } else {myBitmap = MyHelper.resizePhoto (fotografie, cale, myImageView); } if (myBitmap! = null) {myTextView.setText (null); myImageView.setImageBitmap (myBitmap); } pauză; }}} private void runTextRecog () {FirebaseVisionImage image = FirebaseVisionImage.fromBitmap (myBitmap); FirebaseVisionTextDetector detector = FirebaseVision.getInstance (). GetVisionTextDetector (); detector.detectInImage (imagine) .addOnSuccessListener (nou OnSuccessListener() {@ Supraversează public void onSuccess (texte FirebaseVisionText) {processExtractedText (texte); }}). addOnFailureListener (nou OnFailureListener () {@Override public void onFailure (excepție @NonNull Excepție) {Toast.makeText (MainActivity.this, "Excepție", Toast.LENGTH_LONG) .show ();}}); } private void processExtractedText (FirebaseVisionText firebaseVisionText) {myTextView.setText (null); if (firebaseVisionText.getBlocks (). size () == 0) {myTextView.setText (R.string.no_text); întoarcere; } pentru (FirebaseVisionText.Block bloc: firebaseVisionText.getBlocks ()) {myTextView.append (block.getText ()); }}}

Testarea proiectului

Acum este timpul să vedeți Recunoașterea textului ML Kit în acțiune! Instalați acest proiect pe un dispozitiv Android sau pe AVD, alegeți o imagine din galerie și apoi dați-o pe butonul „Verificați textul”. Aplicația ar trebui să răspundă extragând tot textul din imagine, apoi afișându-l într-un TextView.

Rețineți că, în funcție de dimensiunea imaginii dvs. și de cantitatea de text pe care o conține, poate fi necesar să derulați pentru a vedea tot textul extras.

De asemenea, puteți descărca proiectul finalizat de pe GitHub.

Înveliți

Acum știți cum să detectați și să extrageți text dintr-o imagine, folosind ML Kit.

API-ul de recunoaștere a textului este doar o parte a kitului ML. Acest SDK oferă, de asemenea, scanarea codurilor de bare, detectarea feței, etichetarea imaginilor și recunoașterea punctului de reper, cu planuri de a adăuga mai multe API-uri pentru cazuri comune de utilizare mobilă, inclusiv Smart Reply și API-ul conturului de înaltă densitate.

Care API-ul ML Kit este cel mai interesat să încercați? Spuneți-ne în comentariile de mai jos!

Lenovo a dezvăluit un prototip ... ceva PC. Încă nu are nume, dar ete un fel de ThinkPad X1. Compania nici măcar nu o numește laptop, ci o numește pliabilă....

Amazon Prime Day ete la doar o zi ditanță (15 iulie), dar dacă nu doriți ă mai așteptați, Amazon are câteva oferte noi și grozave în linia a Amazon Fire și alte câteva produe conexe. Et...

Alegerea Editorilor