Hvordan trekke ut tekst fra bilder med Googles maskinlærings-SDK

Forfatter: John Stephens
Opprettelsesdato: 27 Januar 2021
Oppdater Dato: 5 Juli 2024
Anonim
Hvordan trekke ut tekst fra bilder med Googles maskinlærings-SDK - Apps
Hvordan trekke ut tekst fra bilder med Googles maskinlærings-SDK - Apps

Innhold


Du kan også bruke API for tekstgjenkjenning som grunnlag for oversettelsesapper, eller tilgjengelighetstjenester der brukeren kan peke kameraet sitt mot hvilken som helst tekst de sliter med, og få det lest høyt for dem.

I denne opplæringen legger vi grunnlaget for et bredt spekter av innovative funksjoner, ved å lage en app som kan trekke ut tekst fra et hvilket som helst bilde i brukerens galleri. Selv om vi ikke vil dekke det i denne opplæringen, kan du også ta tekst fra brukerens omgivelser i sanntid ved å koble denne applikasjonen til enhetens kamera.

På enheten eller i skyen?

Noen av ML Kit API-er er bare tilgjengelige på enheten, men noen få er tilgjengelige på enheten og i skyen, inkludert API for tekstgjenkjenning.

Det skybaserte Text API kan identifisere et bredere spekter av språk og tegn, og lover større nøyaktighet enn dets enhet. Imidlertid, det gjør krever en aktiv Internett-tilkobling, og er bare tilgjengelig for prosjekter på Blaze-nivå.


I denne artikkelen kjører vi API for tekstgjenkjenning lokalt, slik at du kan følge med uavhengig av om du har oppgradert til Blaze, eller om du har gratis Firebase Spark-plan.

Oppretter en tekstgjenkjenningsapp med ML Kit

Opprett et program med innstillingene du ønsker, men når du blir bedt om det, velg malen "Tom aktivitet".

ML Kit SDK er en del av Firebase, så du må koble prosjektet ditt til Firebase ved å bruke sitt SHA-1 signeringssertifikat. Slik får du prosjektets SHA-1:

  • Velg fanen “Gradle” i Android Studio.
  • I panelet "Gradle projects" dobbeltklikker du for å utvide prosjektets "rot", og velg deretter "Oppgaver> Android> Signeringsrapport."
  • Panelet nederst i Android Studio-vinduet bør oppdatere for å vise litt informasjon om dette prosjektet - inkludert SHA-1-signeringssertifikatet.


Slik kobler du prosjektet til Firebase:

  • Start Firebase Console i nettleseren din.
  • Velg "Legg til prosjekt."
  • Gi prosjektet ditt et navn; Jeg bruker "ML Test."
  • Les vilkårene, og hvis du er fornøyd med å fortsette, velg "Jeg godtar ..." etterfulgt av "Opprett prosjekt."
  • Velg "Legg ildkule til Android-appen din."
  • Skriv inn prosjektets pakkenavn, som du finner øverst i MainActivity-filen, og inne i manifestet.
  • Skriv inn prosjektets SHA-1 signeringssertifikat.
  • Klikk på "Registrer app."
  • Velg "Last ned google-services.json." Denne filen inneholder alle nødvendige Firebase-metadata for prosjektet ditt, inkludert API-nøkkelen.
  • I Android Studio drar og slipper du google-services.json-filen til prosjektets katalog.

  • Åpne build.gradle-filen på prosjektnivå og legg til Google Services Classpath:

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

  • Åpne build.gradle-filen på appnivå, og legg til avhengigheter for Firebase Core, Firebase ML Vision og modelltolk, pluss Google-tjenesteplugin:

bruke plugin: com.google.gms.google-services ... ... ... avhengigheter {implementeringsfilTree (dir: libs, inkluderer:) implementering com.google.firebase: firebase-core: 16.0.1 implementering com. google.firebase: firebase-ml-vision: 16.0.0 implementering com.google.firebase: firebase-ml-model-tolk: 16.0.0

På dette tidspunktet må du kjøre prosjektet slik at det kan koble seg til Firebase-serverne:

  • Installer appen din enten på en fysisk Android-smarttelefon eller -brett, eller på en Android Virtual Device (AVD).
  • I "Firebase Console" velger du "Kjør app for å bekrefte installasjonen."
  • Etter noen få øyeblikk, bør du se "Gratulerer"; velg "Fortsett til konsollen."

Last ned Googles forhåndstrenede modeller for maskinlæring

Som standard laster ML Kit bare ned modeller etter behov, så appen vår vil laste ned OCR-modellen når brukeren prøver å trekke ut tekst for første gang.

Dette kan potensielt ha en negativ innvirkning på brukeropplevelsen - tenk å prøve å få tilgang til en funksjon, bare for å oppdage at appen må laste ned flere ressurser før den faktisk kan levere denne funksjonen. I verste fall kan det hende at appen din ikke en gang kan laste ned ressursene den trenger, når den trenger dem, for eksempel hvis enheten ikke har internettforbindelse.

For å sikre at dette ikke skjer med appen vår, skal jeg laste ned den nødvendige OCR-modellen ved installasjonstidspunktet, noe som krever endringer i Maniest.

Mens vi har manifestet, vil jeg også legge til WRITE_EXTERNAL_STORAGE-tillatelsen, som vi vil bruke den senere i denne opplæringen.

// Legg til WRITE_EXTERNAL_STORAGE-tillatelsen // // Legg til følgende //

Bygge oppsettet

La oss få de enkle tingene ut av veien, og lage en layout som består av:

  • En ImageView. Til å begynne med vil dette vise en plassholder, men den vil oppdateres når brukeren velger et bilde fra galleriet.
  • En knapp, som utløser tekstuttrekket.
  • En TextView, der vi viser den utpakkede teksten.
  • En ScrollView. Siden det ikke er noen garanti for at den hentede teksten passer pent på skjermen, kommer jeg til å plassere TextView i en ScrollView.

Her er den ferdige Activity_main.xml-filen:

Denne utformingen refererer til en "ic_placeholder" -tegning, så la oss lage dette nå:

  • Velg "File> New> Image Asset" fra verktøylinjen til Android Studio.
  • Åpne rullegardinmenyen “Ikon Type” og velg “Handlingslinje og faneikoner.”
  • Forsikre deg om at "Clip Art" -knappen er valgt.
  • Gi "Clip Art" -knappen et klikk.
  • Velg bildet du vil bruke som plassholder; Jeg bruker "Legg til bilder."
  • Klikk "OK."
  • Åpne rullegardinmenyen "Tema", og velg "HOLO_LIGHT."
  • I "Navn" -feltet skriver du inn "ic_placeholder."
  • Klikk på "Neste." Les informasjonen, og hvis du er fornøyd med å fortsette, klikker du på "Fullfør."

Handlingslinjeikoner: Starte Galleri-appen

Deretter skal jeg lage et handlingslinjeelement som vil starte brukerens galleri, klar til at de kan velge et bilde.

Du definerer handlingslinjeikoner i en menyressursfil, som bor i “res / menu” -katalogen. Hvis prosjektet ditt ikke inneholder denne katalogen, må du opprette den:

  • Kontroll-klikk på prosjektets "res" -katalog og velg "New> Android Resource Directory."
  • Åpne rullegardinmenyen “Ressurstype” og velg “meny.”
  • Katalognavnet bør oppdateres til "menyen" automatisk, men hvis det ikke gjør det, må du gi det nytt manuelt.
  • Klikk "OK."

Du er nå klar til å opprette menyressursfilen:

  • Kontroll-klikk prosjektets "menykatalog" og velg "Ny> Menyressursfil."
  • Navngi denne filen "my_menu."
  • Klikk "OK."
  • Åpne filen "my_menu.xml", og legg til følgende:

// Lag en element for hver handling //

Menyfilen refererer til en "action_gallery" -streng, så åpne prosjektets res / Values ​​/ Strings.xml-fil og lag denne ressursen. Mens jeg er her, definerer jeg også de andre strengene vi skal bruke i løpet av dette prosjektet.

Galleri Denne appen trenger tilgang til filer på enheten din. Ingen tekst funnet

Deretter bruker du Image Asset Studio til å opprette handlingsfeltets ikon "galleri":

  • Velg "File> New> Image Asset."
  • Sett rullegardinmenyen “Ikon type” til “Handlingslinje og faneikoner.”
  • Klikk på "Clip Art" -knappen.
  • Velg en tegning; Jeg bruker "image."
  • Klikk "OK."
  • For å sikre at dette ikonet er tydelig synlig i handlingslinjen, åpner du rullegardinmenyen "Tema" og velger "HOLO_DARK."
  • Gi dette ikonet navnet "ic_gallery."
  • "Klikk på" Neste ", etterfulgt av" Fullfør. "

Håndtering av tillatelsesforespørsler og klikkhendelser

Jeg skal utføre alle oppgavene som ikke er direkte relatert til tekstgjenkjennings-API-en i en egen BaseActivity-klasse, inkludert å øyeblikkelig aktivere menyen, håndtere klikkhendelser for handlingslinjer og be om tilgang til enhetens lagring.

  • Velg "Fil> Ny> Java-klasse" fra Android Studios verktøylinje.
  • Navngi denne klassen “BaseActivity.”
  • Klikk "OK."
  • Åpne BaseActivity, og legg til følgende:

import android.app.Aktivitet; 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. livsstil; 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; offentlig klasse BaseActivity utvider AppCompatActivity {public static final int WRITE_STORAGE = 100; offentlig statisk endelig int SELECT_PHOTO = 102; public static final String ACTION_BAR_TITLE = "action_bar_title"; offentlig filfoto; @Override beskyttet tomrom onCreate (@Nullable Bundle savedInstanceState) {super.onCreate (savedInstanceState); ActionBar actionBar = getSupportActionBar (); if (actionBar! = null) {actionBar.setDisplayHomeAsUpEnabled (true); actionBar.setTitle (getIntent () getStringExtra (ACTION_BAR_TITLE).); }} @Overr offentlig boolesk onCreateOptionsMenu (menymeny) {getMenuInflater (). Oppblåst (R.menu.my_menu, meny); return true; } @Override offentlig boolesk onOptionsItemSelected (MenuItem item) {switch (item.getItemId ()) {// Hvis “gallery_action” er valgt, så ... // case R.id.gallery_action: //..check at vi har WRITE_STORAGE-tillatelsen // checkPermission (WRITE_STORAGE); gå i stykker; } return super.onOptionsItemSelected (element); } @Override offentlig tomgang påRequestPermissionsResult (int requestCode, @NonNull String-rettigheter, @NonNull int grantResults) {super.onRequestPermissionsResult (requestCode, permissions, grantResults); bytte (requestCode) {case WRITE_STORAGE: // Hvis tillatelsesforespørselen er gitt, så ... // if (grantResults.length> 0 && grantResults == PackageManager.PERMISSION_GRANTED) {//...kall velg Bild // selectPicture ( ); // Hvis tillatelsesforespørselen blir avslått, så ... //} ellers {//..displaystrengen "tillatelse_request" // requestPermission (dette, requestCode, R.string.permission_request); } gå i stykker; }} // Vis dialogruten for tillatelsesforespørsel // offentlig statisk tomromforespørselPermisjon (sluttaktivitetsaktivitet, endelig int-forespørselKode, int msg) {AlertDialog.Builder alert = new AlertDialog.Builder (aktivitet); alert.set (msg); alert.setPositiveButton (android.R.string.ok, new DialogInterface.OnClickListener () {@Override public void onClick (DialogInterface dialogInterface, int i) {dialogInterface.dismiss (); Intent permissonIntent = new Intent (Settings.ACTION_APPLILSATION_TETING) .setData (Uri.parse ("pakke:" + Activity.getPackageName ())); Activity.startActivityForResult (permissonIntent, requestCode);}}); alert.setNegativeButton (android.R.string.cancel, new DialogInterface.OnClickListener () {@Override public void onClick (DialogInterface dialogInterface, int i) {dialogInterface.dismiss ();}}); alert.setCancelable (false); alert.show (); } // Kontroller om brukeren har gitt WRITE_STORAGE tillatelse // public void checkPermission (int requestCode) {switch (requestCode) {case WRITE_STORAGE: int hasWriteExternalStoragePermission = ActivityCompat.checkSelfPermission (dette, Manifest.permission.WRITE_EXTERNAL_STORAGE); // Hvis vi har tilgang til ekstern lagring ... // if (hasWriteExternalStoragePermission == PackageManager.PERMISSION_GRANTED) {//...kall selectPicture, som starter en aktivitet der brukeren kan velge et bilde // selectPicture (); // Hvis tillatelse ikke er gitt, så ... //} ellers {//...forespørsel om tillatelse // ActivityCompat.requestPermissions (dette, nye String {Manifest.permission.WRITE_EXTERNAL_STORAGE}, requestCode); } gå i stykker; }} privat tomrom selectPicture () {photo = MyHelper.createTempFile (foto); Intent intention = new Intent (Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); // Start en aktivitet der brukeren kan velge et bilde // startActivityForResult (hensikt, SELECT_PHOTO); }}

På dette tidspunktet bør prosjektet klage på at det ikke kan løse MyHelper.createTempFile. La oss implementere dette nå!

Endre størrelse på bilder med createTempFile

Lag en ny "MyHelper" -klasse. I denne klassen skal vi endre størrelsen på brukerens valgte bilde, klar til å bli behandlet av API for tekstgjenkjenning.

import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.content.Context; import android.database. Markør; import android.os. Miljø; import android.widget.ImageView; import android.provider.MediaStore; import android.net.Uri; import statisk android.graphics.BitmapFactory.decodeFile; importer statisk android.graphics.BitmapFactory.decodeStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; importer java.io.IOEksepsjon; offentlig klasse MyHelper {public static String getPath (Context context, Uri uri) {String path = ""; Strengprojeksjon = {MediaStore.Images.Media.DATA}; Markørmarkør = context.getContentResolver (). Spørring (uri, projeksjon, null, null, null); int column_index; if (markør! = null) {column_index = cursor.getColumnIndexOrThrow (MediaStore.Images.Media.DATA); cursor.moveToFirst (); bane = cursor.getString (column_index); cursor.close (); } returvei; } offentlig statisk fil createTempFile (Filfil) {Filkatalog = ny fil (Miljø.getExternalStorageDirectory (). getPath () + "/com.jessicathornsby.myapplication"); if (! directory.exists () ||! directory.isDirectory ()) {directory.mkdirs (); } if (fil == null) {fil = ny fil (katalog, "orig.jpg"); } returfil; } offentlig statisk Bitmap resizePhoto (File imageFile, Context context, Uri uri, ImageView-visning) {BitmapFactory.Options newOptions = new BitmapFactory.Options (); prøv {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 ()); return compressPhoto (imageFile, BitmapFactory.decodeStream (context.getContentResolver (). openInputStream (uri), null, newOptions)); } fangst (FileNotFoundException-unntak) {exception.printStackTrace (); returnere null; }} offentlig statisk Bitmap resizePhoto (File imageFile, String path, ImageView-visning) {BitmapFactory.Options alternativer = new BitmapFactory.Options (); decodeFile (bane, alternativer); int photoHeight = options.outHeight; int photoWidth = options.outWidth; options.inSampleSize = Math.min (photoWidth / view.getWidth (), photoHeight / view.getHeight ()); returnere compressPhoto (imageFile, BitmapFactory.decodeFile (bane, alternativer)); } privat statisk Bitmap compressPhoto (File photoFile, Bitmap bitmap) {prøv {FileOutputStream fOutput = new FileOutputStream (photoFile); bitmap.compress (Bitmap.CompressFormat.JPEG, 70, fOutput); fOutput.close (); } catch (IOException exception) {exception.printStackTrace (); } returner bitmap; }}

Sett bildet til en ImageView

Deretter må vi implementere onActivityResult () i vår MainActivity-klasse, og sette brukerens valgte bilde til 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; offentlig klasse MainActivity utvider BaseActivity {privat Bitmap myBitmap; privat ImageView myImageView; privat TextView myTextView; @Override beskyttet tomrom onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); myTextView = findViewById (R.id.textView); myImageView = findViewById (R.id.imageView); } @Override beskyttet tomrom onActivityResult (int requestCode, int resultCode, Intent data) {super.onActivityResult (requestCode, resultCode, data); if (resultCode == RESULT_OK) {switch (requestCode) {case WRITE_STORAGE: checkPermission (requestCode); gå i stykker; sak SELECT_PHOTO: Uri dataUri = data.getData (); Stringsti = MyHelper.getPath (dette, dataUri); if (bane == null) {myBitmap = MyHelper.resizePhoto (foto, dette, dataUri, myImageView); } else {myBitmap = MyHelper.resizePhoto (foto, bane, myImageView); } if (myBitmap! = null) {myTextView.setText (null); myImageView.setImageBitmap (myBitmap); } gå i stykker; }}}}

Kjør dette prosjektet på en fysisk Android-enhet eller AVD, og ​​gi handlingslinjeikonet et klikk. Når du blir bedt om det, gi WRITE_STORAGE tillatelse og velg et bilde fra galleriet. dette bildet skal nå vises i appens brukergrensesnitt.

Nå har vi lagt grunnlaget, vi er klare til å begynne å trekke ut litt tekst!

Lærer en app å gjenkjenne tekst

Jeg vil utløse tekstgjenkjenning som svar på en klikkhendelse, så vi må implementere en 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; offentlig klasse MainActivity utvider BaseActivity implementerer View.OnClickListener {privat Bitmap myBitmap; privat ImageView myImageView; privat TextView myTextView; @Override beskyttet tomrom 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) {// Vi implementerer runTextRecog i neste trinn // runTextRecog (); } gå i stykker; }}

ML Kit kan bare behandle bilder når de er i FirebaseVisionImage-format, så vi må konvertere bildet vårt til et FirebaseVisionImage-objekt. Du kan opprette en FirebaseVisionImage fra en Bitmap, media.Image, ByteBuffer eller en byte-gruppe. Siden vi jobber med Bitmaps, må vi kalle verktøysmetoden fromBitmap () i FirebaseVisionImage-klassen, og sende den Bitmap-filen vår.

privat tomrom runTextRecog () {FirebaseVisionImage image = FirebaseVisionImage.fromBitmap (myBitmap);

ML Kit har forskjellige detektorklasser for hver av sine bildegjenkjenningsoperasjoner. For tekst må vi bruke FirebaseVisionTextDetector-klassen, som utfører optisk karaktergjenkjenning (OCR) på et bilde.

Vi oppretter en forekomst av FirebaseVisionTextDetector ved å bruke getVisionTextDetector:

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

Deretter må vi sjekke FirebaseVisionImage for tekst, ved å kalle detectInImage () -metoden og sende den FirebaseVisionImage-objektet. Vi må også implementere onSuccess og onFailure tilbakeringinger, pluss tilsvarende lyttere slik at appen vår blir varslet når resultatene blir tilgjengelige.

detector.detectInImage (image) .addOnSuccessListener (ny OnSuccessListener() {@Override // Gjør //}}). AddOnFailureListener (nytt OnFailureListener () {@Override offentlig tomrom onFailure (@NonNull unntak unntak) {// Oppgaven mislyktes med et unntak //}}); }

Hvis denne operasjonen mislykkes, vil jeg vise en skål, men hvis operasjonen er en suksess, vil jeg ringe prosessExtraktert tekst med svaret.

På dette tidspunktet ser tekstkjenningskoden min slik ut:

// Opprett en FirebaseVisionImage // privat tomrom runTextRecog () {FirebaseVisionImage image = FirebaseVisionImage.fromBitmap (myBitmap); // Opprett en forekomst av FirebaseVisionCloudTextDetector // FirebaseVisionTextDetector detector = FirebaseVision.getInstance (). GetVisionTextDetector (); // Registrer en OnSuccessListener // detector.detectInImage (image) .addOnSuccessListener (ny OnSuccessListener() {@Override // Implementere onSuccess-tilbakeringing // public void onSuccess (FirebaseVisionText-tekster) {// Call processExtractedText med svaret // processExtractedText (tekster); }}). addOnFailureListener (new OnFailureListener () {@Override // Implementere onFailure calback // public void onFailure (@NonNull Exception exception) {Toast.makeText (MainActivity.this, "Exception", Toast.LENGTH_LONG). show ( );}}); }

Hver gang appen vår mottar en varsel om suksess, må vi analysere resultatene.

Et FirebaseVisionText-objekt kan inneholde elementer, linjer og blokker, der hver blokk typisk tilsvarer et enkelt avsnitt av tekst. Hvis FirebaseVisionText returnerer 0 blokker, viser vi strengen "no_text", men hvis den inneholder en eller flere blokker, vil vi vise den hentede teksten som en del av TextView.

private void processExtractedText (FirebaseVisionText firebaseVisionText) {myTextView.setText (null); if (firebaseVisionText.getBlocks (). størrelse () == 0) {myTextView.setText (R.string.no_text); komme tilbake; } for (FirebaseVisionText.Block-blokk: firebaseVisionText.getBlocks ()) {myTextView.append (block.getText ()); }}}

Her er den fullførte MainActivity-koden:

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; offentlig klasse MainActivity utvider BaseActivity implementerer View.OnClickListener {privat Bitmap myBitmap; privat ImageView myImageView; privat TextView myTextView; @Override beskyttet tomrom 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 offentlig tomrom onClick (View view) {switch (view.getId ()) {case R.id.checkText: if (myBitmap! = Null) {runTextRecog (); } gå i stykker; }} @Override beskyttet tomrom onActivityResult (int requestCode, int resultCode, Intent data) {super.onActivityResult (requestCode, resultCode, data); if (resultCode == RESULT_OK) {switch (requestCode) {case WRITE_STORAGE: checkPermission (requestCode); gå i stykker; sak SELECT_PHOTO: Uri dataUri = data.getData (); Stringsti = MyHelper.getPath (dette, dataUri); if (bane == null) {myBitmap = MyHelper.resizePhoto (foto, dette, dataUri, myImageView); } else {myBitmap = MyHelper.resizePhoto (foto, bane, myImageView); } if (myBitmap! = null) {myTextView.setText (null); myImageView.setImageBitmap (myBitmap); } gå i stykker; }}} privat tomrom runTextRecog () {FirebaseVisionImage image = FirebaseVisionImage.fromBitmap (myBitmap); FirebaseVisionTextDetector detector = FirebaseVision.getInstance (). GetVisionTextDetector (); detector.detectInImage (image) .addOnSuccessListener (ny OnSuccessListener() {@ Overstyr offentlig tomrom onSuccess (FirebaseVisionText-tekster) {processExtractedText (tekster); }}). addOnFailureListener (new OnFailureListener () {@Override public void onFailure (@NonNull Exception exception) {Toast.makeText (MainActivity.this, "Exception", Toast.LENGTH_LONG). show ();}}); } privat tomromprosessExtractedText (FirebaseVisionText firebaseVisionText) {myTextView.setText (null); if (firebaseVisionText.getBlocks (). størrelse () == 0) {myTextView.setText (R.string.no_text); komme tilbake; } for (FirebaseVisionText.Block-blokk: firebaseVisionText.getBlocks ()) {myTextView.append (block.getText ()); }}}

Testing av prosjektet

Nå er det på tide å se ML Kit's tekstgjenkjenning i aksjon! Installer dette prosjektet på en Android-enhet eller AVD, velg et bilde fra galleriet, og gi deretter knappen "Kontroller teksten" et trykk. Appen skal svare ved å trekke ut all teksten fra bildet, og deretter vise den i en TextView.

Avhengig av størrelsen på bildet og mengden tekst det inneholder, kan det hende du må bla for å se all den utpakkede teksten.

Du kan også laste ned det ferdige prosjektet fra GitHub.

Innpakking

Du vet nå hvordan du kan oppdage og trekke ut tekst fra et bilde ved hjelp av ML Kit.

Text Recognition API er bare en del av ML-settet. Denne SDK-en tilbyr også strekkodeskanning, ansiktsgjenkjenning, bildemerking og landemerke-gjenkjennelse, med planer om å legge til flere API-er for vanlige mobilbrukstilfeller, inkludert Smart Answer og et ansiktskontur-API med høy tetthet.

Hvilket ML Kit API er du mest interessert i å prøve? Gi oss beskjed i kommentarene nedenfor!

om om ikke Google Pixel 4 har blitt lekket nok, tok en ny hand-on med enheten veien ut i naturen. Denne gangen får vi et bedre blikk på Face Unlock, bakiden av enheten matt finih og kjermen ...

Google Pixel-erien er kjent for å få Android-oppdateringer før å godt om alle andre enheter, men det virker om om noen få Pixel-brukere rapporterer om et tort problem etter op...

Populær