Kuvien tekstin purkaminen Googlen Machine Learning SDK: lla

Kirjoittaja: John Stephens
Luomispäivä: 27 Tammikuu 2021
Päivityspäivä: 5 Heinäkuu 2024
Anonim
Google Places How-To Webinar
Video: Google Places How-To Webinar

Sisältö


Voit käyttää myös tekstintunnistusliittymää perustana käännössovelluksille tai esteettömyyspalveluille, joissa käyttäjä voi osoittaa kameransa mihin tahansa tekstiin, jota he kamppailevat, ja saada se lukemaan ääneen heille.

Tässä oppaassa luomme perustan monille innovatiivisille ominaisuuksille luomalla sovelluksen, joka voi poimia tekstiä mistä tahansa käyttäjän galleriassa olevasta kuvasta. Vaikka emme käsittele sitä tässä opetusohjelmassa, voit myös kaapata tekstiä käyttäjän ympäristöstä reaaliajassa yhdistämällä tämän sovelluksen laitteen kameraan.

Laitteessa vai pilvessä?

Jotkut ML Kit -sovellusliittymistä ovat käytettävissä vain laitteissa, mutta muutamat ovat saatavana laitteessa ja pilvessä, mukaan lukien Tekstintunnistus-sovellusliittymä.


Pilvipohjainen Teksti-sovellusliittymä voi tunnistaa laajemman kieli- ja merkkivalikoiman, ja se lupaa suuremman tarkkuuden kuin sen laitteessa oleva vastine. Kuitenkin tekee vaativat aktiivisen Internet-yhteyden, ja se on saatavana vain Blaze-tason projekteihin.

Käytämme tässä artikkelissa Tekstin tunnistus-sovellusliittymää paikallisesti, joten voit seurata sitä riippumatta siitä, oletko päivittänyt versioon Blaze vai oletko ilmaisessa Firebase Spark -suunnitelmassa.

Tekstin tunnistussovelluksen luominen ML Kit -sovelluksella

Luo sovellus valitsemillasi asetuksilla, mutta valitse kehotettaessa Tyhjä aktiviteetti -malli.

ML Kit SDK on osa Firebasea, joten sinun on kytkettävä projekti Firebaseen käyttämällä SHA-1-allekirjoitussertifikaattia. Hanki projektisi SHA-1:

  • Valitse Android Studion Gradle-välilehti.
  • Kaksoisnapsauta Gradle-projektit -paneelissa laajentaaksesi projektisi juuria ja valitsemalla sitten Tehtävät> Android> Allekirjoitusraportti.
  • Android Studio -ikkunan alareunassa olevan paneelin tulisi päivittyä, jotta näyttöön tulee joitain tietoja projektista - mukaan lukien sen SHA-1-allekirjoitusvarmenne.


Projektin kytkeminen Firebaseen:

  • Käynnistä selaimesi Firebase-konsoli.
  • Valitse Lisää projekti.
  • Anna projektille nimi; Käytän ML-testiä.
  • Lue ehdot ja, jos jatkat mielellään, valitse ”Hyväksyn…” ja sen jälkeen ”Luo ​​projekti”.
  • Valitse Lisää Firebase Android-sovellukseesi.
  • Kirjoita projektisi paketin nimi, joka löydät MainActivity-tiedoston yläosasta ja manifestin sisäpuolelle.
  • Anna projektisi SHA-1-allekirjoitussertifikaatti.
  • Napsauta "Rekisteröi sovellus".
  • Valitse ”Lataa google-services.json.” Tämä tiedosto sisältää kaikki tarvittavat Firebase-metatiedot projektillesi, mukaan lukien API-avain.
  • Vedä ja pudota Android Studio -sovelluksessa google-services.json-tiedosto projektisi sovellushakemistoon.

  • Avaa projektitason build.gradle-tiedostosi ja lisää Google-palveluiden luokkatie:

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

  • Avaa sovellustason build.gradle-tiedosto ja lisää riippuvuudet Firebase Core, Firebase ML Vision ja mallitulkki sekä Google-palveluiden laajennus:

käytä laajennusta: com.google.gms.google-palvelut ... ... ... riippuvuudet {toteutustiedostoTree (oh: libs, sisältää:) toteutus com.google.firebase: firebase-core: 16.0.1 toteutuskom. google.firebase: firebase-ml-visio: 16.0.0 toteutus com.google.firebase: firebase-ml-malli-tulkki: 16.0.0

Tässä vaiheessa sinun täytyy suorittaa projekti, jotta se voi muodostaa yhteyden Firebase-palvelimiin:

  • Asenna sovelluksesi joko fyysiselle Android-älypuhelimelle tai -tablet-laitteelle tai Android Virtual Device (AVD) -sovellukseen.
  • Valitse Firebase-konsolissa Suorita sovellus vahvistaaksesi asennus.
  • Muutaman hetken kuluttua sinun pitäisi nähdä ”Onnittelut”; Valitse ”Jatka konsoliin”.

Lataa Googlen esiopetetut koneoppimallit

Oletusarvoisesti ML Kit lataa malleja vain silloin, kun niitä tarvitaan, joten sovelluksemme lataa OCR-mallin, kun käyttäjä yrittää poimia tekstiä ensimmäistä kertaa.

Tällä voi olla kielteisiä vaikutuksia käyttäjäkokemukseen - kuvittele yrittävän käyttää ominaisuutta vain huomataksesi, että sovelluksen on ladattava lisää resursseja ennen kuin se voi tosiasiallisesti toimittaa tämän ominaisuuden. Pahimmassa tapauksessa sovelluksesi ei ehkä edes pysty lataamaan tarvitsemiaan resursseja, kun se tarvitsee niitä, esimerkiksi jos laitteella ei ole Internet-yhteyttä.

Varmistaakseni, että näin ei tapahdu sovelluksessamme, aion ladata tarvittavan tekstintunnistusmallin asennusaikana, joka vaatii joitain muutoksia Maniest-ohjelmaan.

Vaikka manifesti on auki, aion myös lisätä WRITE_EXTERNAL_STORAGE -luvan, jota käytämme myöhemmin tässä opetusohjelmassa.

// Lisää WRITE_EXTERNAL_STORAGE -lupa // // Lisää seuraava //

Suunnittelun rakentaminen

Annetaan helppoja juttuja tieltä ja luodaan asettelu, joka koostuu:

  • ImageView. Aluksi tämä näyttää paikkamerkin, mutta se päivitetään, kun käyttäjä valitsee kuvan galleriastaan.
  • Painike, joka laukaisee tekstin erottamisen.
  • Tekstinäkymä, jossa näytetään poimittu teksti.
  • ScrollView. Koska ei ole takeita siitä, että poimittu teksti sopii hyvin näytölle, aion sijoittaa TextView-kuvan ScrollView-osaan.

Tässä on valmis aktiviteetti_main.xml-tiedosto:

Tämä asettelu viittaa piirrettyyn ”ic_placeholder”, joten luotakaamme nyt:

  • Valitse Android Studio -työkaluriviltä “File> New> Image Asset”.
  • Avaa avattava ”Kuvaketyyppi” ja valitse ”Toimintapalkin ja välilehden kuvakkeet”.
  • Varmista, että ”ClipArt” -valintanappi on valittu.
  • Napsauta “ClipArt” -painiketta napsautuksella.
  • Valitse kuva, jota haluat käyttää paikkamerkkinä; Käytän Lisää valokuvia -kohtaa.
  • Napsauta “OK”.
  • Avaa avattava ”Teema” ja valitse ”HOLO_LIGHT”.
  • Kirjoita ”Nimi” -kenttään ”ic_placeholder”.
  • Napsauta Seuraava. Lue tiedot ja napsauta sitten Valmis -painiketta, jos jatkat onnistuneesti.

Toimintopalkin kuvakkeet: Galleria-sovelluksen käynnistäminen

Seuraavaksi aion luoda toimintapalkkikohdan, joka avaa käyttäjän gallerian, valmis käyttämään heitä valitsemaan kuvan.

Voit määrittää toimintapalkkikuvakkeet valikkotiedostoon, joka sijaitsee ”res / menu” -hakemistossa. Jos projektissasi ei ole tätä hakemistoa, sinun on luotava se:

  • Napsauta Control-napsauttamalla projektisi ”res” -hakemistoa ja valitsemalla ”New> Android Resource Directory”.
  • Avaa avattava Resurssityyppi ja valitse “valikko”.
  • Hakemiston nimen pitäisi päivittyä automaattisesti valikkoksi, mutta jos se ei ole, sinun on nimettävä se uudelleen manuaalisesti.
  • Napsauta “OK”.

Olet nyt valmis luomaan valikkotiedostotiedoston:

  • Napsauta Control-napsauttamalla projektisi “valikko” -hakemistoa ja valitsemalla ”Uusi> Valikkoresurssitiedosto”.
  • Nimeä tämä tiedosto ”oma_valikko”.
  • Napsauta “OK”.
  • Avaa “my_menu.xml”-tiedosto ja lisää seuraava:

// Luo elementti jokaisesta toiminnasta //

Valikkotiedosto viittaa ”action_gallery” -merkkijonoon, joten avaa projektisi res / arvot / strings.xml-tiedosto ja luo tämä resurssi. Vaikka olen täällä, määrittelen myös muut jouset, joita käytämme tässä projektissa.

galleria Tämän sovelluksen on käytettävä laitteesi tiedostoja. Tekstiä ei löytynyt

Luo seuraavaksi Image Asset Studion avulla toimintapalkin “ic_gallery” -kuvake:

  • Valitse ”File> New> Image Asset.”
  • Aseta avattava ”Kuvaketyyppi” kohtaan ”Toimintapalkin ja välilehden kuvakkeet”.
  • Napsauta ClipArt-painiketta.
  • Valitse piirrettävä; Käytän ”kuvaa”.
  • Napsauta “OK”.
  • Varmista, että tämä kuvake on selvästi näkyvissä toimintapalkissa, avaa avattava teema ja valitsemalla ”HOLO_DARK”.
  • Nimeä tämä kuvake ”ic_gallery”.
  • “Napsauta Seuraava ja seuraa sitten Valmis.

Lupapyyntöjen ja napsautustapahtumien käsittely

Aion suorittaa kaikki tehtävät, jotka eivät liity suoraan tekstin tunnistussovellusliittymään, erillisessä BaseActivity-luokassa, mukaan lukien valikon pikaistaminen, toimintopalkin napsautustapahtumien käsitteleminen ja laitteen tallennustilan käyttöoikeuden pyytäminen.

  • Valitse Android Studion työkaluriviltä ”Tiedosto> Uusi> Java-luokka”.
  • Nimeä tämä luokka ”BaseActivity”.
  • Napsauta “OK”.
  • Avaa BaseActivity ja lisää seuraava:

tuo android.app.Activity; tuo android.support.v4.app.ActivityCompat; tuo android.support.v7.app.ActionBar; tuo android.support.v7.app.AlertDialog; tuo android.support.v7.app.AppCompatActivity; tuo android.os.Bundle; tuo android.content.DialogInterface; tuo android.content.Intent; Tuo android.Manifest; tuo android.provider.MediaStore; Tuo android.view.Menu; tuo android.view.MenuItem; tuo android.content.pm.PackageManager; tuo android.net.Uri; Tuo android.provider.Asetukset; tuo android.support.annotation.NonNull; Tuo android.support.annotation.Nollable; tuonti java.io.File; julkinen luokka BaseActivity laajentaa AppCompatActivity {julkinen staattinen lopullinen int WRITE_STORAGE = 100; julkinen staattinen lopullinen int SELECT_PHOTO = 102; julkinen staattinen lopullinen merkkijono ACTION_BAR_TITLE = "action_bar_title"; julkinen tiedosto valokuva; @Ohota suojattu tyhjä onCreate (@Nullable Bundle savedInstanceState) {super.onCreate (savedInstanceState); ActionBar actionBar = getSupportActionBar (); if (actionBar! = nolla) {actionBar.setDisplayHomeAsUpEnabled (totta); actionBar.setTitle (getIntent (). getStringExtra (ACTION_BAR_TITLE)); }} @Orride public boolean onCreateOptionsMenu (valikkovalikko) {getMenuInflater (). Inflate (R.menu.my_menu, menu); palata totta; } @Orride public boolean onOptionsItemSelected (MenuItem item) {switch (item.getItemId ()) {// Jos valitaan ”galleria_action”, niin ... // tapaus R.id.gallery_action: //...tarkasta, että meillä on WRITE_STORAGE -lupa // checkPermission (WRITE_STORAGE); tauko; } palauta super.onOptionsItemSelected (tuote); } @Orride public void onRequestPermissionsResult (int requestCode, @NonNull String käyttöoikeudet, @NonNull int grantResults) {super.onRequestPermissionsResult (requestCode, permissions, grantResults); kytkin (requestCode) {tapaus WRITE_STORAGE: // Jos lupapyyntö myönnetään, niin ... // if (grantResults.length> 0 && grantResults == PackageManager.PERMISSION_GRANTED) {//...soita selectPicture // selectPicture ( ); // Jos lupapyyntö evätään, niin ... //} muuten {//...näytetään ”luba_request” -merkkijono // requestPermission (tämä, requestCode, R.string.permission_request); } tauko; }} // Näytä lupapyyntövalintaikkuna // julkinen staattinen void requestPermission (lopullinen aktiviteetti, lopullinen int requestCode, int msg) {AlertDialog.Builder alert = new AlertDialog.Builder (toiminta); alert.set (msg); alert.setPositiveButton (android.R.string.ok, uusi DialogInterface.OnClickListener () {@Orride public void onClick (DialogInterface dialogInterface, int i) {dialogInterface.dismiss (); Intent permissonIntent = uusi tarkoitus (Settings.ACTION_APPLICATION_DL .setData (Uri.parse ("paketti:" + aktiviteetti.getPackageName ())); activity.startActivityForResult (permissonIntent, requestCode);}}); alert.setNegativeButton (android.R.string.cancel, uusi DialogInterface.OnClickListener () {@Orride public void onClick (DialogInterface dialogInterface, int i) {dialogInterface.dismiss ();}}); alert.setCancelable (epätosi); alert.show (); } // Tarkista, onko käyttäjä myöntänyt WRITE_STORAGE -luvan // public void checkPermission (int requestCode) {switch (requestCode) {case WRITE_STORAGE: int hasWriteExternalStoragePermission = ActivityCompat.checkSelfPermission (this, Manifest.permission.WRITE_EXTERNAL_STORAGE); // Jos meillä on pääsy ulkoiseen tallennustilaan ... // if (hasWriteExternalStoragePermission == PackageManager.PERMISSION_GRANTED) {//...soittovalokuva, joka käynnistää toiminnan, jossa käyttäjä voi valita kuvan // selectPicture (); // Jos lupaa ei ole annettu, niin ... //} muuten {//...pyydä lupaa // ActivityCompat.requestPermissions (tämä, uusi merkkijono {Manifest.permission.WRITE_EXTERNAL_STORAGE}, requestCode); } tauko; }} yksityinen tyhjä selectPicture () {photo = MyHelper.createTempFile (kuva); Aikomus aikomus = uusi tarkoitus (Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); // Aloita toiminta, jossa käyttäjä voi valita kuvan // startActivityForResult (tarkoitus, SELECT_PHOTO); }}

Tässä vaiheessa projektisi pitäisi valittaa siitä, että se ei pysty ratkaisemaan MyHelper.createTempFile-ongelmaa. Toteutetaan tämä nyt!

Kuvien koon muuttaminen createTempFile-ohjelmalla

Luo uusi ”MyHelper” -luokka. Tässä luokassa muutamme käyttäjän valitun kuvan kokoa, joka on valmis käsittelemään Tekstin tunnistus -sovellusliittymä.

tuo android.graphics.Bitmap; tuo android.graphics.BitmapFactory; tuo android.content.Context; Tuo android.database.Cursor; Tuo android.os.Ympäristö; tuo android.widget.ImageView; tuo android.provider.MediaStore; tuo android.net.Uri; tuo staattinen android.graphics.BitmapFactory.decodeFile; tuo staattinen android.graphics.BitmapFactory.decodeStream; tuonti java.io.File; tuo java.io.FileNotFoundException; tuo java.io.FileOutputStream; tuo java.io.IOException; julkinen luokka MyHelper {julkinen staattinen merkkijono getPath (kontekstiyhteys, Uri uri) {merkkipolku = ""; Stringprojection = {MediaStore.Images.Media.DATA}; Kohdistimen kohdistin = context.getContentResolver () .kysely (uri, projektio, nolla, nolla, nolla); int-sarake_index; if (kohdistin! = nolla) {column_index = cursor.getColumnIndexOrThrow (MediaStore.Images.Media.DATA); cursor.moveToFirst (); polku = kohdistin.getString (sarakkeen_indeksi); cursor.close (); } paluu matka; } julkinen staattinen tiedosto createTempFile (tiedostotiedosto) {tiedostohakemisto = uusi tiedosto (Environment.getExternalStorageDirectory (). getPath () + "/com.jessicathornsby.myapplication"); if (! hakemisto.exists () ||! hakemisto.isDirectory ()) {hakemisto.mkdirs (); } if (tiedosto == nolla) {tiedosto = uusi tiedosto (hakemisto, "orig.jpg"); } palautustiedosto; } julkinen staattinen bittikartta resizePhoto (tiedoston imageFile, kontekstiyhteys, Uri uri, ImageView-näkymä) {BitmapFactory.Options newOptions = new BitmapFactory.Options (); kokeile {decodeStream (context.getContentResolver (). openInputStream (uri), nolla, newOptions); int photoHeight = newOptions.outHeight; int photoWidth = newOptions.outWidth; newOptions.inSampleSize = Math.min (photoWidth / view.getWidth (), photoHeight / view.getHeight ()); palauta compressPhoto (imageFile, BitmapFactory.decodeStream (context.getContentResolver (). openInputStream (uri), nolla, newOptions)); } saalis (FileNotFoundException poikkeus) {poikkeus.printStackTrace (); palauta nolla; }} julkinen staattinen bittikartta resizePhoto (tiedosto imageFile, merkkijono, ImageView-näkymä) {BitmapFactory.Options options = new BitmapFactory.Options (); decodeFile (polku, vaihtoehdot); int photoHeight = options.outHeight; int photoWidth = options.outWidth; options.inSampleSize = Math.min (photoWidth / view.getWidth (), photoHeight / view.getHeight ()); return compressPhoto (imageFile, BitmapFactory.decodeFile (polku, asetukset)); } yksityinen staattinen bittikartta compressPhoto (tiedoston photoFile, bittikartta bittikartta) {kokeile {FileOutputStream fOutput = uusi FileOutputStream (photoFile); bitmap.compress (Bitmap.CompressFormat.JPEG, 70, fOutput); fOutput.close (); } saalis (IOException poikkeus) {poikkeus.printStackTrace (); } palauta bittikartta; }}

Aseta kuva ImageView-asetukseksi

Seuraavaksi meidän on otettava käyttöön onActivityResult () MainActivity-luokassamme ja asetettava käyttäjän valitsema kuva ImageView-kuvaan.

tuo android.graphics.Bitmap; tuo android.os.Bundle; tuo android.widget.ImageView; tuo android.content.Intent; tuo android.widget.TextView; tuo android.net.Uri; julkisen luokan MainActivity laajentaa BaseActivity {yksityinen bittikartta myBitmap; yksityinen ImageView myImageView; yksityinen TextView myTextView; @Ohota suojattu tyhjä onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); myTextView = findViewById (R.id.textView); myImageView = findViewById (R.id.imageView); } @Ohota suojattu tyhjä onActivityResult (int requestCode, int tulosCode, Intent data) {super.onActivityResult (requestCode, resultCode, data); if (resultCode == RESULT_OK) {kytkin (requestCode) {tapaus WRITE_STORAGE: checkPermission (requestCode); tauko; tapaus SELECT_PHOTO: Uri dataUri = data.getData (); Merkkijono = MyHelper.getPath (tämä, dataUri); if (polku == nolla) {myBitmap = MyHelper.resizePhoto (kuva, tämä, dataUri, myImageView); } else {myBitmap = MyHelper.resizePhoto (valokuva, polku, myImageView); } if (myBitmap! = nolla) {myTextView.setText (nolla); myImageView.setImageBitmap (myBitmap); } tauko; }}}}

Suorita projekti fyysisellä Android-laitteella tai AVD: llä ja napsauta toimintapalkkikuvaketta. Anna pyydettäessä WRITE_STORAGE -lupa ja valitse kuva galleriasta; tämä kuva pitäisi nyt näyttää sovelluksesi käyttöliittymässä.

Nyt olemme luoneet perustan, olemme valmiita aloittamaan tekstin poimimisen!

Sovelluksen opettaminen tunnistamaan teksti

Haluan käynnistää tekstin tunnistuksen vastauksena napsautustapahtumaan, joten meidän on otettava käyttöön OnClickListener:

tuo android.graphics.Bitmap; tuo android.os.Bundle; tuo android.widget.ImageView; tuo android.content.Intent; tuo android.widget.TextView; Tuo android.view.View; tuo android.net.Uri; julkisen luokan MainActivity laajentaa BaseActivity-toteutuksia View.OnClickListener {yksityinen bittikartta myBitmap; yksityinen ImageView myImageView; yksityinen TextView myTextView; @Ohota suojattu tyhjä 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 (tämä); } @Kirjoita julkinen tyhjä onClick-näkymässä (Näytä näkymä) {vaihda (view.getId ()) {tapaus R.id.checkText: if (myBitmap! = Null) {// Toteutamme runTextRecogin seuraavassa vaiheessa // runTextRecog (); } tauko; }}

ML-paketti pystyy käsittelemään kuvia vain FirebaseVisionImage-muodossa, joten meidän on muunnettava kuvamme FirebaseVisionImage-objektiin. Voit luoda FirebaseVisionImage-bittikartan, media.Image-, ByteBuffer- tai tavutaulukon. Koska työskentelemme bittikarttojen kanssa, meidän on soitettava FirebaseVisionImage-luokan apuohjelmasta fromBitmap () ja välitettävä se bittikarttaamme.

yksityinen tyhjä runTextRecog () {FirebaseVisionImage image = FirebaseVisionImage.fromBitmap (myBitmap);

ML-Kitillä on erilaiset ilmaisinluokat jokaiselle kuvan tunnistamistoiminnolle. Tekstissä meidän on käytettävä FirebaseVisionTextDetector-luokkaa, joka suorittaa kuvan optisen merkkitunnistuksen (OCR).

Luomme FirebaseVisionTextDetector-esiintymän käyttämällä getVisionTextDetector:

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

Seuraavaksi meidän on tarkistettava FirebaseVisionImage-teksti, soittamalla deteInImage () -menetelmälle ja välittämällä se FirebaseVisionImage-objektille. Meidän on myös otettava käyttöön onSuccess- ja onFailure-takaisinsoitot sekä vastaavat kuuntelijat, jotta sovelluksellemme ilmoitetaan, kun tulokset tulevat saataville.

detector.detectInImage (kuva) .addOnSuccessListener (uusi OnSuccessListener() {@Override // Tehtävä //}}). AddOnFailureListener (uusi OnFailureListener () {@Orride public void onFailure (@NonNull Exception poikkeus) {// Tehtävä epäonnistui poikkeuksella //}}); }

Jos tämä toimenpide epäonnistuu, aion näyttää paahtoleipää, mutta jos toimenpide onnistuu, soitan processExtractedText vastauksen kanssa.

Tässä vaiheessa tekstintunnistuskoodini näyttää tältä:

// Luo FirebaseVisionImage // yksityinen tyhjä runTextRecog () {FirebaseVisionImage image = FirebaseVisionImage.fromBitmap (myBitmap); // Luo FirebaseVisionCloudTextDetector-ilmentymä // FirebaseVisionTextDetector detector = FirebaseVision.getInstance (). GetVisionTextDetector (); // Rekisteröi OnSuccessListener // detector.detectInImage (kuva) .addOnSuccessListener (uusi OnSuccessListener() {@Override // Toteuta onSuccess-takaisinsoitto // public void onSuccess (FirebaseVisionText-tekstit) {// Soita processExtractedText vastauksella // processExtractedText (tekstit); }}). addOnFailureListener (uusi OnFailureListener () {@Override // Ota käyttöön onFailure-takaisinsovellus // julkinen tyhjä onFailure (@NonNull-poikkeuspoikkeus) {Toast.makeText (MainActivity.this, "Exception", Toast.LENGTH_LONG) .show ( );}}); }

Aina kun sovelluksemme saa onSuccess-ilmoituksen, meidän on jäsentävä tulokset.

FirebaseVisionText-objekti voi sisältää elementtejä, rivejä ja lohkoja, joissa kukin lohko tyypillisesti vastaa yhtä tekstin kohtaa. Jos FirebaseVisionText palauttaa 0 lohkoa, näytetään “no_text” -merkkijono, mutta jos se sisältää yhden tai useamman lohkon, näytämme haetun tekstin osana TextView-sovellusta.

yksityinen mitätön prosessiExtractedText (FirebaseVisionText firebaseVisionText) {myTextView.setText (nolla); if (firebaseVisionText.getBlocks (). koko () == 0) {myTextView.setText (R.string.no_text); palata; } (FirebaseVisionText.Block-lohko: firebaseVisionText.getBlocks ()) {myTextView.append (block.getText ()); }}}

Tässä on valmis MainActivity-koodi:

tuo android.graphics.Bitmap; tuo android.os.Bundle; tuo android.widget.ImageView; tuo android.content.Intent; tuo android.widget.TextView; tuo android.widget.Toast; Tuo android.view.View; tuo android.net.Uri; tuo android.support.annotation.NonNull; tuo com.google.firebase.ml.vision.common.FirebaseVisionImage; tuo com.google.firebase.ml.vision.text.FirebaseVisionText; tuo com.google.firebase.ml.vision.text.FirebaseVisionTextDetector; tuo com.google.firebase.ml.vision.FirebaseVision; tuo com.google.android.gms.tasks.OnSuccessListener; tuo com.google.android.gms.tasks.OnFailureListener; julkisen luokan MainActivity laajentaa BaseActivity-toteutuksia View.OnClickListener {yksityinen bittikartta myBitmap; yksityinen ImageView myImageView; yksityinen TextView myTextView; @Ohota suojattu tyhjä 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 (tämä); } @Kyllä julkinen tyhjä onClick (Näytä näkymä) {vaihtaa (view.getId ()) {tapaus R.id.checkText: if (myBitmap! = Null) {runTextRecog (); } tauko; }} @Orride suojattu tyhjä onActivityResult (int requestCode, int tulosCode, Intent data) {super.onActivityResult (requestCode, resultCode, data); if (resultCode == RESULT_OK) {kytkin (requestCode) {tapaus WRITE_STORAGE: checkPermission (requestCode); tauko; tapaus SELECT_PHOTO: Uri dataUri = data.getData (); Merkkijono = MyHelper.getPath (tämä, dataUri); if (polku == nolla) {myBitmap = MyHelper.resizePhoto (kuva, tämä, dataUri, myImageView); } else {myBitmap = MyHelper.resizePhoto (valokuva, polku, myImageView); } if (myBitmap! = nolla) {myTextView.setText (nolla); myImageView.setImageBitmap (myBitmap); } tauko; }}} yksityinen tyhjä runTextRecog () {FirebaseVisionImage image = FirebaseVisionImage.fromBitmap (myBitmap); FirebaseVisionTextDetector detector = FirebaseVision.getInstance (). GetVisionTextDetector (); detector.detectInImage (kuva) .addOnSuccessListener (uusi OnSuccessListener() {@Suorita julkinen tyhjä onSuccess (FirebaseVisionText -tekstit) {processExtractedText (tekstit); })). addOnFailureListener (uusi OnFailureListener () {@Orride public void onFailure (@NonNull Exception poikkeus) {Toast.makeText (MainActivity.this, "Exception", Toast.LENGTH_LONG) .show ();}}); } yksityinen tyhjä prosessiExtractedText (FirebaseVisionText firebaseVisionText) {myTextView.setText (nolla); if (firebaseVisionText.getBlocks (). koko () == 0) {myTextView.setText (R.string.no_text); palata; } (FirebaseVisionText.Block-lohko: firebaseVisionText.getBlocks ()) {myTextView.append (block.getText ()); }}}

Projektin testaaminen

Nyt on aika nähdä ML Kitin tekstin tunnistus toiminnassa! Asenna projekti Android-laitteelle tai AVD: lle, valitse kuva galleriasta ja anna sitten ”Tarkista teksti” -painike napauttaa. Sovelluksen tulisi vastata uuttamalla koko teksti kuvasta ja näyttämällä se sitten TextView-muodossa.

Huomaa, että kuvan koosta ja sen sisältämän tekstin määrästä riippuen saatat joutua vierittämään nähdäksesi kaiken puretun tekstin.

Voit myös ladata valmis projektin GitHubista.

Käärimistä

Tiedät nyt, kuinka havaita ja poimia tekstiä kuvasta ML Kit -sovelluksen avulla.

Tekstintunnistusliittymä on vain yksi osa ML-sarjaa. Tämä SDK tarjoaa myös viivakoodiskannauksen, kasvojentunnistuksen, kuvan merkinnät ja maamerkkien tunnistuksen. Suunnitelmissa on lisätä lisää sovellusliittymiä tavallisiin matkaviestinkäyttötapauksiin, mukaan lukien Smart Vastaus ja tiheä kasvot.

Mitä ML Kit -sovellusliittymää olet kiinnostunein kokeilla? Kerro meille alla olevissa kommenteissa!

10 parasta eläinsovellusta Androidille!

Lewis Jackson

Heinäkuu 2024

Eläimet ovat ihania, eikö niin? On olemaa erilaiia ​​tapoja, joilla ihmiet rakatavat eläimiä. Jotkut haluavat vain katella öpöjä kuvia, kun taa toiet haluavat lahjoi...

10 parasta anime-peliä Androidille!

Lewis Jackson

Heinäkuu 2024

Anime-pelit eiintyvät kaikkialla. Koko tyylilaji menee nykyään monialutaieki. Et aa vain uutta animea, vaan myö uuden pelin, jonkin mangan ja kokonaien otkuien muun iällö...

Suositeltu Sinulle