Sådan udpakkes tekst fra billeder med Googles Machine Learning SDK

Forfatter: John Stephens
Oprettelsesdato: 27 Januar 2021
Opdateringsdato: 5 Juli 2024
Anonim
Sådan udpakkes tekst fra billeder med Googles Machine Learning SDK - Apps
Sådan udpakkes tekst fra billeder med Googles Machine Learning SDK - Apps

Indhold


Du kan også bruge tekstgenkendelses-API'et som grundlag for oversættelsesapps eller tilgængelighedstjenester, hvor brugeren kan rette sit kamera mod enhver tekst, de kæmper med, og få det læst højt for dem.

I denne tutorial vil vi lægge grundlaget for en lang række innovative funktioner ved at oprette en app, der kan udtrække tekst fra ethvert billede i brugerens galleri. Selvom vi ikke dækker det i denne tutorial, kan du også fange tekst fra brugerens omgivelser i realtid ved at forbinde denne applikation til enhedens kamera.

På enheden eller i skyen?

Nogle af ML Kit API'erne er kun tilgængelige på enheden, men nogle få er tilgængelige på enheden og i skyen, inklusive API til tekstgenkendelse.

Den skybaserede tekst-API kan identificere et bredere spektrum af sprog og tegn og lover større nøjagtighed end dets modstykke på enheden. Dog det gør kræver en aktiv internetforbindelse og er kun tilgængelig for projekter på Blaze-niveau.


I denne artikel kører vi API for tekstgenkendelse lokalt, så du kan følge med uanset om du har opgraderet til Blaze, eller du er på den gratis Firebase Spark-plan.

Oprettelse af en appgenkendelsesapp med ML Kit

Opret en applikation med de valgte indstillinger, men vælg skabelonen "Tom aktivitet", når du bliver bedt om det.

ML Kit SDK er en del af Firebase, så du bliver nødt til at forbinde dit projekt til Firebase ved hjælp af dets SHA-1-underskrivelsescertifikat. Sådan får du projektets SHA-1:

  • Vælg Android Studios fane "Gradle".
  • I panelet "Gradle-projekter" skal du dobbeltklikke for at udvide projektets "rod" og derefter vælge "Opgaver> Android> Signeringsrapport."
  • Panelet nederst i Android Studio-vinduet skal opdateres for at vise nogle oplysninger om dette projekt - inklusive dets SHA-1 signeringscertifikat.


Sådan forbinder du dit projekt til Firebase:

  • Start Firebase Console i din webbrowser.
  • Vælg "Tilføj projekt."
  • Giv dit projekt et navn; Jeg bruger "ML Test."
  • Læs vilkår og betingelser, og hvis du er glad for at fortsætte, skal du vælge "Jeg accepterer ..." efterfulgt af "Opret projekt."
  • Vælg "Føj ildbase til din Android-app."
  • Indtast dit projekts pakkenavn, som du finder øverst i MainActivity-filen og inde i Manifestet.
  • Indtast dit projekts SHA-1 signeringscertifikat.
  • Klik på "Registrer app."
  • Vælg “Download google-services.json.” Denne fil indeholder alle de nødvendige Firebase-metadata til dit projekt, inklusive API-nøglen.
  • I Android Studio skal du trække og slippe filen google-services.json til dit projekts "app" -katalog.

  • Åbn din build.gradle-fil på projektniveau, og tilføj Google Services-klassespaden:

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

  • Åbn din build.gradle-fil på appniveau, og tilføj afhængigheder for Firebase Core, Firebase ML Vision og modeltolk, plus plugins til Google-tjenester:

anvende plugin: com.google.gms.google-services ... ... ... afhængigheder {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 tidspunkt skal du køre dit projekt, så det kan oprette forbindelse til Firebase-serverne:

  • Installer din app på enten en fysisk Android-smartphone eller -tablet eller en Android Virtual Device (AVD).
  • I "Firebase Console" skal du vælge "Kør app for at bekræfte installationen."
  • Efter nogle få øjeblikke skal du se en "Tillykke"; vælg "Fortsæt til konsollen."

Download Googles foruddannede maskinlæringsmodeller

Som standard downloader ML Kit kun modeller, når og når det er nødvendigt, så vores app vil downloade OCR-modellen, når brugeren forsøger at udtrække tekst for første gang.

Dette kan potentielt have en negativ indvirkning på brugeroplevelsen - forestil dig at prøve at få adgang til en funktion, kun for at opdage, at appen skal downloade flere ressourcer, før den faktisk kan levere denne funktion. I værste fald kan din app muligvis ikke engang hente de ressourcer, den har brug for, når den har brug for dem, f.eks. Hvis enheden ikke har nogen internetforbindelse.

For at sikre, at dette ikke sker med vores app, vil jeg downloade den nødvendige OCR-model på installationstidspunktet, hvilket kræver nogle ændringer til Maniest.

Mens vi har manifestet åbent, vil jeg også tilføje tilladelsen WRITE_EXTERNAL_STORAGE, som vi vil bruge den senere i denne tutorial.

// Tilføj tilladelsen WRITE_EXTERNAL_STORAGE // // Tilføj følgende //

Bygning af layout

Lad os få de lette ting ud af vejen og oprette et layout bestående af:

  • En ImageView. Oprindeligt viser dette en pladsholder, men den opdateres, når brugeren vælger et billede fra deres galleri.
  • En knap, der udløser tekstekstraktionen.
  • En TextView, hvor vi får vist den udpakkede tekst.
  • En ScrollView. Da der ikke er nogen garanti for, at den udpakkede tekst passer pænt på skærmen, vil jeg placere TextView i en ScrollView.

Her er den færdige aktivitet_main.xml fil:

Dette layout refererer til en "ic_placeholder" -tegning, så lad os oprette dette nu:

  • Vælg "File> New> Image Asset" fra værktøjslinjen til Android Studio.
  • Åbn rullemenuen "Ikonetype", og vælg "Handlingslinje og fanebladeikoner."
  • Sørg for, at radioknappen "Clip Art" er valgt.
  • Giv knappen "Clip Art" et klik.
  • Vælg det billede, du vil bruge som din pladsholder; Jeg bruger "Føj til fotos."
  • Klik på "OK."
  • Åbn rullemenuen "Tema", og vælg "HOLO_LIGHT."
  • I feltet "Navn" skal du indtaste "ic_placeholder."
  • Klik på "Næste." Læs oplysningerne, og hvis du er glad for at fortsætte, skal du klikke på "Udfør."

Handlingslinjeikoner: Start af Galleri-appen

Dernæst skal jeg oprette en handlingslinjepost, der starter brugerens galleri, klar til, at de kan vælge et billede.

Du definerer handlingslinjeikoner inde i en menurressourcefil, der bor i biblioteket "res / menu". Hvis dit projekt ikke indeholder dette bibliotek, skal du oprette det:

  • Kontrol-klik på dit projekt "res" -katalog, og vælg "Ny> Android Resource Directory."
  • Åbn rullemenuen "Ressource type", og vælg "menu."
  • "Directory name" skal opdateres til "menu" automatisk, men hvis det ikke gør det, skal du omdøbe det manuelt.
  • Klik på "OK."

Du er nu klar til at oprette menurressursfilen:

  • Kontrol-klik på projektets "menu" -katalog, og vælg "Ny> Menu-ressourcefil."
  • Navngiv denne fil "my_menu."
  • Klik på "OK."
  • Åbn filen "my_menu.xml", og tilføj følgende:

// Opret en element til enhver handling //

Menufilen refererer til en "action_gallery" -streng, så åbn dit projekt res / Values ​​/ Strings.xml-fil og opret denne ressource. Mens jeg er her, definerer jeg også de andre strenge, vi bruger i hele dette projekt.

Galleri Denne app skal have adgang til filer på din enhed. Ingen tekst fundet

Brug derefter Image Asset Studio til at oprette handlingslinjens “ic_gallery” -ikon:

  • Vælg "File> New> Image Asset."
  • Indstil rullemenuen "Ikonetype" til "Handlingslinje og fanebladeikoner."
  • Klik på knappen "Clip Art".
  • Vælg en tegnbar; Jeg bruger "image."
  • Klik på "OK."
  • For at sikre, at dette ikon er klart synlig i handlingslinjen, skal du åbne rullemenuen "Tema" og vælge "HOLO_DARK."
  • Navngiv dette ikon "ic_gallery."
  • "Klik på" Næste ", efterfulgt af" Udfør. "

Håndtering af tilladelsesanmodninger og klikbegivenheder

Jeg vil udføre alle de opgaver, der ikke er direkte relateret til tekstgenkendelses-API i en separat BaseActivity-klasse, herunder øjeblikkelig åbning af menuen, håndtering af klikbegivenheder i handlingslinjen og anmode om adgang til enhedens lager.

  • Vælg "Fil> Ny> Java-klasse" fra Android Studios værktøjslinje.
  • Navngiv denne klasse "BaseActivity."
  • Klik på "OK."
  • Åbn BaseActivity, og tilføj 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; public class BaseActivity udvider 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 tomrum onCreate (@Nullable Bundle gemtInstanceState) {super.onCreate (gemtInstanceState); ActionBar actionBar = getSupportActionBar (); if (actionBar! = null) {actionBar.setDisplayHomeAsUpEnabled (sand); actionBar.setTitle (getIntent () getStringExtra (ACTION_BAR_TITLE).); }} @Overr offentlig boolesk onCreateOptionsMenu (menu-menu) {getMenuInflater (). Oppust (R.menu.my_menu, menu); vende tilbage sandt; } @Override offentlig boolesk onOptionsItemSelected (MenuItem-vare) {switch (item.getItemId ()) {// Hvis “gallery_action” er valgt, så ... // case R.id.gallery_action: //...check vi har WRITE_STORAGE tilladelsen // checkPermission (WRITE_STORAGE); pause; } return super.onOptionsItemSelected (vare); } @Override offentligt ugyldigt onRequestPermissionsResult (int requestCode, @NonNull String-tilladelser, @NonNull int grantResults) {super.onRequestPermissionsResult (requestCode, permissions, giveResults); switch (requestCode) {case WRITE_STORAGE: // Hvis tilladelsesanmodningen er givet, så ... // if (giveResults.length> 0 && grantResults == PackageManager.PERMISSION_GRANTED) {//...kald vælg // // selectPicture ( ); // Hvis tilladelsesanmodningen afvises, skal ... //} andet {//...display strengen "tilladelse_anmodning" // anmodningPermission (dette, anmodningskode, R.string.permission_request); } pause; }} // Vis dialogboksen for tilladelsesanmodning // offentlig statisk tomrumsanmodningPermission (endelig aktivitetsaktivitet, sidste int-anmodningKode, int msg) {AlertDialog.Builder alarm = new AlertDialog.Builder (aktivitet); alert.set (msg); alert.setPositiveButton (android.R.string.ok, ny DialogInterface.OnClickListener () {@Override public void onClick (DialogInterface dialogInterface, int i) {dialogInterface.dismiss (); Intent permissonIntent = new Intent (Settings.ACTION_APPLILSATION_TET) .setData (Uri.parse ("pakke:" + Activity.getPackageName ())); Activity.startActivityForResult (permissonIntent, requestCode);}}); alarm.setNegativeButton (android.R.string.cancel, ny DialogInterface.OnClickListener () {@Override public void onClick (DialogInterface dialogInterface, int i) {dialogInterface.dismiss ();}}); alert.setCancelable (falsk); alert.show (); } // Kontroller, om brugeren har givet WRITE_STORAGE-tilladelse // public void checkPermission (int requestCode) {switch (requestCode) {case WRITE_STORAGE: int hasWriteExternalStoragePermission = ActivityCompat.checkSelfPermission (dette, Manifest.permission.WRITE_EXTERNAL_STORAGE) // Hvis vi har adgang til ekstern lagring ... // if (hasWriteExternalStoragePermission == PackageManager.PERMISSION_GRANTED) {//...opkald selectPicture, der starter en aktivitet, hvor brugeren kan vælge et billede // selectPicture (); // Hvis der ikke er givet tilladelse, skal ... //} andet {//...anmode om tilladelse // ActivityCompat.requestPermissions (dette, nyt string {Manifest.permission.WRITE_EXTERNAL_STORAGE}, requestCode); } pause; }} privat tomrum selectPicture () {photo = MyHelper.createTempFile (foto); Intent intention = new Intent (Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); // Start en aktivitet, hvor brugeren kan vælge et billede // startActivityForResult (intention, SELECT_PHOTO); }}

På dette tidspunkt skal dit projekt klage over, at det ikke kan løse MyHelper.createTempFile. Lad os implementere dette nu!

Ændre størrelse på billeder med createTempFile

Opret en ny klasse "MyHelper". I denne klasse skal vi ændre størrelsen på brugerens valgte billede, klar til at blive behandlet af API'en for tekstgenkendelse.

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; import statisk android.graphics.BitmapFactory.decodeStream; 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 = ""; Strengprojektion = {MediaStore.Images.Media.DATA}; Markørmarkør = context.getContentResolver (). Forespørgsel (uri, projektion, null, null, null); int column_index; if (cursor! = null) {column_index = cursor.getColumnIndexOrThrow (MediaStore.Images.Media.DATA); cursor.moveToFirst (); sti = cursor.getString (column_index); cursor.close (); } retursti } offentlig statisk fil createTempFile (Filfil) {Filmappe = ny fil (Miljø.getExternalStorageDirectory (). getPath () + "/com.jessicathornsby.myapplication"); if (! directory.exists () ||! directory.isDirectory ()) {directory.mkdirs (); } if (fil == null) {fil = ny fil (bibliotek, "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 ()); returnere compressPhoto (imageFile, BitmapFactory.decodeStream (context.getContentResolver (). openInputStream (uri), null, newOptions)); } fangst (undtagelse af FileNotFoundException) {exception.printStackTrace (); returnere null; }} offentlig statisk Bitmap resizePhoto (File imageFile, String path, ImageView-visning) {BitmapFactory.Options-indstillinger = ny BitmapFactory.Options (); decodeFile (sti, indstillinger); int photoHeight = optioner.outHeight; int photoWidth = optioner.outWidth; options.inSampleSize = Math.min (photoWidth / view.getWidth (), photoHeight / view.getHeight ()); returnere compressPhoto (imageFile, BitmapFactory.decodeFile (sti, indstillinger)); } privat statisk Bitmap compressPhoto (File photoFile, Bitmap bitmap) {prøv {FileOutputStream fOutput = nyt FileOutputStream (photoFile); bitmap.compress (Bitmap.CompressFormat.JPEG, 70, fOutput); fOutput.close (); } fangst (undtagelse fra IOException) {exception.printStackTrace (); } return bitmap; }}

Indstil billedet til en ImageView

Dernæst skal vi implementere onActivityResult () i vores MainActivity-klasse og indstille brugerens valgte billede til vores 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 udvider BaseActivity {privat Bitmap myBitmap; privat ImageView myImageView; privat TextView myTextView; @Override beskyttet tomrum onCreate (Bundle gemtInstanceState) {super.onCreate (gemtInstanceState); setContentView (R.layout.activity_main); myTextView = findViewById (R.id.textView); myImageView = findViewById (R.id.imageView); } @Override beskyttet tomrum onActivityResult (int requestCode, int resultCode, Intent data) {super.onActivityResult (requestCode, resultCode, data); if (resultCode == RESULT_OK) {switch (requestCode) {case WRITE_STORAGE: checkPermission (requestCode); pause; sag SELECT_PHOTO: Uri dataUri = data.getData (); Stringsti = MyHelper.getPath (dette, dataUri); if (sti == null) {myBitmap = MyHelper.resizePhoto (foto, dette, dataUri, myImageView); } andet {myBitmap = MyHelper.resizePhoto (foto, sti, myImageView); } if (myBitmap! = null) {myTextView.setText (null); myImageView.setImageBitmap (myBitmap); } pause; }}}}

Kør dette projekt på en fysisk Android-enhed eller AVD, og ​​giv handlingslinieikonet et klik. Når du bliver bedt om det, skal du give WRITE_STORAGE tilladelse og vælge et billede fra galleriet; dette billede skal nu vises i din apps brugergrænseflade.

Nu har vi lagt grunden, vi er klar til at begynde at udtrække tekst!

Lærer en app til at genkende tekst

Jeg vil udløse tekstgenkendelse som svar på en klikbegivenhed, så vi er nødt til at 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 udvider BaseActivity implementerer View.OnClickListener {privat Bitmap myBitmap; privat ImageView myImageView; privat TextView myTextView; @Override beskyttet tomrum onCreate (Bundle gemtInstanceState) {super.onCreate (gemtInstanceState); setContentView (R.layout.activity_main); myTextView = findViewById (R.id.textView); myImageView = findViewById (R.id.imageView); findViewById (R.id.checkText) .setOnClickListener (dette); } @Override public void onClick (View view) {switch (view.getId ()) {case R.id.checkText: if (myBitmap! = Null) {// Vi implementerer runTextRecog i næste trin // runTextRecog (); } pause; }}

ML Kit kan kun behandle billeder, når de er i FirebaseVisionImage-formatet, så vi er nødt til at konvertere vores billede til et FirebaseVisionImage-objekt. Du kan oprette en FirebaseVisionImage fra en Bitmap, media.Image, ByteBuffer eller en byte-matrix. Da vi arbejder med Bitmaps, er vi nødt til at kalde fromBitmap () -værktøjsmetoden i FirebaseVisionImage-klassen og videregive den til vores Bitmap.

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

ML Kit har forskellige detektorklasser til hver af sine billedgenkendelsesoperationer. For tekst skal vi bruge klassen FirebaseVisionTextDetector, der udfører optisk tegngenkendelse (OCR) på et billede.

Vi opretter en forekomst af FirebaseVisionTextDetector ved hjælp af getVisionTextDetector:

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

Dernæst skal vi kontrollere FirebaseVisionImage for tekst ved at kalde metoden detectInImage () og videregive det FirebaseVisionImage-objektet. Vi er også nødt til at implementere onSuccess og onFailure tilbagekald, plus tilsvarende lyttere, så vores app bliver underrettet, når resultater bliver tilgængelige.

detector.detectInImage (image) .addOnSuccessListener (ny OnSuccessListener() {@Override // At gøre //}}) addOnFailureListener (ny OnFailureListener () {@Override offentligt ugyldigt onFailure (@NonNull undtagelses undtagelse) {// Opgave mislykkedes med en undtagelse //}}); }

Hvis denne operation mislykkes, vil jeg vise en skål, men hvis operationen er en succes, kalder jeg processExtractedText med svaret.

På dette tidspunkt ser min tekstdetekteringskode sådan ud:

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

Hver gang vores app modtager en onSuccess-anmeldelse, er vi nødt til at analysere resultaterne.

Et FirebaseVisionText-objekt kan indeholde elementer, linjer og blokke, hvor hver blok typisk svarer til et enkelt afsnit af tekst. Hvis FirebaseVisionText returnerer 0 blokke, viser vi strengen "no_text", men hvis den indeholder en eller flere blokke, viser vi den hentede tekst som en del af vores TextView.

privat tomrumsprocesExtractedText (FirebaseVisionText firebaseVisionText) {myTextView.setText (null); if (firebaseVisionText.getBlocks (). størrelse () == 0) {myTextView.setText (R.string.no_text); Vend tilbage; } for (FirebaseVisionText.Block-blok: firebaseVisionText.getBlocks ()) {myTextView.append (block.getText ()); }}}

Her er den udfyldte MainActivity-kode:

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 udvider BaseActivity implementerer View.OnClickListener {privat Bitmap myBitmap; privat ImageView myImageView; privat TextView myTextView; @Override beskyttet tomrum onCreate (Bundle gemtInstanceState) {super.onCreate (gemtInstanceState); setContentView (R.layout.activity_main); myTextView = findViewById (R.id.textView); myImageView = findViewById (R.id.imageView); findViewById (R.id.checkText) .setOnClickListener (dette); } @Override offentligt ugyldigt onClick (View view) {switch (view.getId ()) {case R.id.checkText: if (myBitmap! = Null) {runTextRecog (); } pause; }} @Override beskyttet tomrum onActivityResult (int requestCode, int resultCode, Intent data) {super.onActivityResult (requestCode, resultCode, data); if (resultCode == RESULT_OK) {switch (requestCode) {case WRITE_STORAGE: checkPermission (requestCode); pause; sag SELECT_PHOTO: Uri dataUri = data.getData (); Stringsti = MyHelper.getPath (dette, dataUri); if (sti == null) {myBitmap = MyHelper.resizePhoto (foto, dette, dataUri, myImageView); } andet {myBitmap = MyHelper.resizePhoto (foto, sti, myImageView); } if (myBitmap! = null) {myTextView.setText (null); myImageView.setImageBitmap (myBitmap); } pause; }}} privat tomrum runTextRecog () {FirebaseVisionImage image = FirebaseVisionImage.fromBitmap (myBitmap); FirebaseVisionTextDetector detector = FirebaseVision.getInstance (). GetVisionTextDetector (); detector.detectInImage (image) .addOnSuccessListener (ny OnSuccessListener() {@Override offentligt ugyldigt onSuccess (FirebaseVisionText-tekster) {processExtractedText (tekster); }}). addOnFailureListener (ny OnFailureListener () {@Override offentligt tomrum onFailure (@NonNull undtagelse undtagelse) {Toast.makeText (MainActivity.this, "Undtagelse", Toast.LENGTH_LONG). show ();}}); } privat tomrumsprocesExtractedText (FirebaseVisionText firebaseVisionText) {myTextView.setText (null); if (firebaseVisionText.getBlocks (). størrelse () == 0) {myTextView.setText (R.string.no_text); Vend tilbage; } for (FirebaseVisionText.Block-blok: firebaseVisionText.getBlocks ()) {myTextView.append (block.getText ()); }}}

Test af projektet

Nu er det tid til at se ML Kit's tekstgenkendelse i aktion! Installer dette projekt på en Android-enhed eller AVD, vælg et billede fra galleriet, og giv derefter knappen "Kontroller teksten" et tryk. Appen skal svare ved at udtrække al teksten fra billedet og derefter vise den i en TextView.

Bemærk, at afhængigt af størrelsen på dit billede og mængden af ​​tekst, det indeholder, skal du muligvis rulle for at se alt den udpakkede tekst.

Du kan også downloade det afsluttede projekt fra GitHub.

Afslutter

Du ved nu, hvordan du registrerer og uddrager tekst fra et billede ved hjælp af ML Kit.

Text Recognition API er kun en del af ML Kit. Denne SDK tilbyder også stregkodescanning, ansigtsregistrering, billedmærkning og landemærkegenkendelse med planer om at tilføje flere API'er til almindelige tilfælde af mobil brug, herunder Smart Answer og et ansigtskontur API med høj densitet.

Hvilket ML Kit API er du mest interesseret i at prøve? Fortæl os det i kommentarerne nedenfor!

Xiaomi Redmi Y2 (ogå kendt om Redmi 2) var en af ​​de bedre low-end telefoner i 2018, hvilket bragte nogle uventede funktioner til en budgetenhed. Nu er Redmi Y3 officielt annonceret i Indien (am...

Vi har ikke alle $ 1.500 til en MacBook, men mange af o har ikke brug for alle die klokker og fløjter. Til din baale bærbare pc-behov til en overkommelig pri, denne Dell Chromebook er en lyd...

Vores Publikationer.