Kuidas piltidelt teksti eraldada Google'i masinõppe SDK abil

Autor: John Stephens
Loomise Kuupäev: 27 Jaanuar 2021
Värskenduse Kuupäev: 5 Juuli 2024
Anonim
Kuidas piltidelt teksti eraldada Google'i masinõppe SDK abil - Rakendused
Kuidas piltidelt teksti eraldada Google'i masinõppe SDK abil - Rakendused

Sisu


Võite kasutada ka tekstituvastuse API-d tõlkerakenduste või juurdepääsetavusteenuste alusena, kus kasutaja saab suunata oma kaamera ükskõik millise teksti ees, millega nad vaeva näevad, ja lasta see neil neile ette lugeda.

Selles õpetuses paneme aluse paljudele innovaatilistele funktsioonidele, luues rakenduse, mis saab teksti ekstraheerida kasutaja galerii mis tahes pildilt. Ehkki me seda selles õpetuses ei kata, saate reaalajas ka kasutaja ümbrusest teksti lüüa, ühendades selle rakenduse seadme kaameraga.

Seadmes või pilves?

Mõned ML Kit-i API-liidesed, kaasa arvatud tekstituvastuse API, on saadaval ainult seadmes ja pilves.

Pilvepõhine teksti API saab tuvastada laiema hulga keeli ja tähemärke ning lubab suuremat täpsust kui selle seade seadmes. Kuid siiski teeb vajavad aktiivset Interneti-ühendust ja on saadaval ainult Blaze'i taseme projektide jaoks.


Selles artiklis käitame tekstituvastuse API-d kohapeal, nii et saate seda jälgida sõltumata sellest, kas olete üle läinud versioonile Blaze või kasutate tasuta Firebase Sparki plaani.

Teksti tuvastamise rakenduse loomine ML-komplektiga

Looge oma valitud sätetega rakendus, kuid kui seda küsitakse, valige mall „Tühjenda tegevust”.

ML Kit SDK on osa Firebasest, nii et peate projekti ühendama Firebase'iga, kasutades selle SHA-1 allkirjastamistõendit. Projekti SHA-1 hankimiseks toimige järgmiselt.

  • Valige Android Studio vahekaart „Gradle“.
  • Tehke topeltklõps paneelil „Gradle projektid“, et laiendada oma projekti juur, ja valige siis „Ülesanded> Android> Allkirjastamisaruanne“.
  • Android Studio akna allservas asuv paneel peaks värskendama, et kuvada selle projekti kohta teavet - sealhulgas selle SHA-1 allkirjastamistunnistust.


Projekti ühendamiseks Firebase'iga toimige järgmiselt.

  • Käivitage oma veebibrauseris Firebase'i konsool.
  • Valige „Lisa projekt”.
  • Pange oma projektile nimi; Ma kasutan “ML-testi”.
  • Lugege tingimusi ja kui teil on hea meel jätkata, siis valige „Nõustun…”, millele järgneb „Loo projekt”.
  • Valige „Lisage oma Androidi rakendusse Firebase”.
  • Sisestage projekti paketi nimi, mille leiate faili MainActivity ülaosast ja manifesti sisemusest.
  • Sisestage projekti SHA-1 allkirjastamistunnistus.
  • Klõpsake „Registreeri rakendus”.
  • Valige „Laadige alla google-services.json”. See fail sisaldab kõiki teie projekti jaoks vajalikke Firebase'i metaandmeid, sealhulgas API-võtit.
  • Lohistage Android Studio-s fail google-services.json oma projekti kausta „app”.

  • Avage oma projekti tasemel build.gradle fail ja lisage Google'i teenuste klassitee:

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

  • Avage oma rakendustasandil ehitatav gradientfail ja lisage Firebase Core'i, Firebase ML Visioni ja mudelitõlgi ning Google'i teenuste pistikprogrammi sõltuvused:

rakenda pistikprogrammi: com.google.gms.google-teenused ... ... ... sõltuvused {juurutamisfailTree (dir: libid, sisaldama:) juurutamine com.google.firebase: firebase-core: 16.0.1 teostuskomm. google.firebase: firebase-ml-vision: 16.0.0 teostus com.google.firebase: firebase-ml-model-interpreter: 16.0.0

Sel hetkel peate oma projekti käivitama, et see saaks luua ühenduse Firebase serveritega:

  • Installige rakendus kas füüsilisse Androidi nutitelefoni või tahvelarvutisse või Androidi virtuaalseadmesse (AVD).
  • Valige Firebase'i konsoolis suvand „Käivita rakendus installimise kontrollimiseks“.
  • Mõne hetke pärast peaksite nägema õnnitlust; valige „Jätka konsoolile”.

Laadige alla Google'i eelkoolitatud masinõppe mudelid

Vaikimisi laadib ML Kit mudeleid alla ainult siis, kui neid vajatakse, nii et meie rakendus laadib OCR-mudeli alla, kui kasutaja proovib esimest korda teksti välja tõmmata.

See võib potentsiaalselt negatiivselt mõjutada kasutajakogemust - kujutlege, et proovite funktsioonile juurde pääseda, kui avastate, et rakendus peab selle funktsiooni edastamiseks alla laadima rohkem ressursse. Halvimal juhul ei pruugi teie rakendus isegi siis, kui tal neid vaja on, vajalike ressursside alla laadida, näiteks kui seadmel pole Interneti-ühendust.

Veendumaks, et seda ei juhtu meie rakendusega, laadin installimise ajal alla vajaliku OCR-mudeli, mis nõuab Maniesti teatud muudatusi.

Ehkki meil on manifest avatud, lisan ka loa WRITE_EXTERNAL_STORAGE, mida kasutame hiljem selles õppetükis.

// Lisage luba WRITE_EXTERNAL_STORAGE // // Lisage järgmine //

Paigutuse koostamine

Liigutagem asjad lihtsaks ja looge paigutus, mis koosneb:

  • ImageView. Esialgu kuvatakse see kohahoidja, kuid seda värskendatakse, kui kasutaja valib pildi oma galeriist.
  • Nupp, mis käivitab teksti eraldamise.
  • Tekstvaade, kus kuvame väljavõtte teksti.
  • ScrollView. Kuna pole mingit garantiid, et väljavõttev tekst sobib ekraanile kenasti, paigutan tekstivaate ScrollView sisse.

Siin on valmis tegevus_main.xml-fail:

See paigutus osutab joonisele “ic_placeholder”, nii et loome selle nüüd:

  • Valige Android Studio tööriistaribal „File> New> Image Asset“.
  • Avage rippmenüü „Ikooni tüüp” ja valige „Toiminguriba ja vahelehtedeikoonid”.
  • Veenduge, et raadionupp „Clip Art” oleks valitud.
  • Klõpsake nuppu „Clip Art”.
  • Valige pilt, mida soovite kohahoidjana kasutada; Ma kasutan funktsiooni „Lisa fotodele”.
  • Klõpsake „OK“.
  • Avage rippmenüü „Teema” ja valige „HOLO_LIGHT”.
  • Sisestage väljale „Nimi” „ic_placeholder”.
  • Klõpsake nuppu „Järgmine”. Lugege teavet ja kui teil on hea meel jätkata, klõpsake siis nuppu „Lõpeta”.

Toiminguriba ikoonid: rakenduse Galerii käivitamine

Järgmisena loon tegevusriba üksuse, mis käivitab kasutaja galerii ja on pildi valimiseks valmis.

Saate määratleda toiminguriba ikoonid menüü ressursifailis, mis asub kataloogis „res / menüü”. Kui teie projekt ei sisalda seda kataloogi, peate selle looma:

  • Klõpsake juhtnupul oma projekti kataloogil „res” ja valige „Uus> Androidi ressursikataloog”.
  • Avage rippmenüü „Ressursi tüüp” ja valige “menüü”.
  • „Kataloogi nimi” peaks automaatselt värskendama „menüüks”, kuid kui seda ei tehta, peate selle käsitsi ümber nimetama.
  • Klõpsake „OK“.

Olete nüüd valmis looma menüü ressursifaili:

  • Klõpsake juhtnuppu oma projekti menüü kataloogis ja valige „Uus> Menüü ressursifail”.
  • Pange sellele failile nimi “minu_menüü”.
  • Klõpsake „OK“.
  • Avage fail “my_menu.xml” ja lisage järgmine teave:

// loo element iga toimingu jaoks //

Menüüfail viitab stringile „action_gallery”, nii et avage projekti fail / väärtused / strings.xml ja looge see ressurss. Siin viibides määratlen ma ka muud stringid, mida kogu selle projekti jooksul kasutame.

Galerii Sellel rakendusel peab olema juurdepääs teie seadme failidele. Teksti ei leitud

Järgmisena looge Image Asset Studio abil tegevusriba ikoon “ic_gallery”:

  • Valige „File> New> Image Asset“.
  • Valige rippmenüüst „Ikooni tüüp” väärtuseks „Toiminguriba ja vahelehtedeikoonid”.
  • Klõpsake nuppu „Clip Art”.
  • Valige joonistatav; Ma kasutan pilti.
  • Klõpsake „OK“.
  • Veendumaks, et see ikoon on tegevusribal selgelt nähtav, avage rippmenüü „Teema” ja valige „HOLO_DARK”.
  • Pange sellele ikoonile nimi “ic_gallery”.
  • Klõpsake „Järgmine“, millele järgneb „Lõpeta“.

Loataotluste ja klõpsamissündmuste käsitlemine

Kavatsen täita kõik BaseAktiivsuse klassis kõik funktsioonid, mis pole teksti tuvastamise API-ga otseselt seotud, sealhulgas menüü kiirendamine, toiminguriba klõpsamise sündmuste käsitlemine ja seadme talletusruumile juurdepääsu taotlemine.

  • Valige Android Studio tööriistaribalt „Fail> Uus> Java klass“.
  • Pange see klass nimeks “BaseActivity”.
  • Klõpsake „OK“.
  • Avage BaseActivity ja lisage järgmine:

import android.app.Activity; import android.support.v4.app.ActivityCompat; import android.support.v7.app.ActionBar; import android.support.v7.app.AlertDialog; impordi 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.Seaded; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import java.io.Fail; avaliku klassi BaseActivity laiendab AppCompatActivity {public static final int WRITE_STORAGE = 100; avalik staatiline lõplik int SELECT_PHOTO = 102; avalik staatiline lõplik string String ACTION_BAR_TITLE = "action_bar_title"; avalik fail; @Kuivata kaitstud tühine onCreate (@Nullable Bundle savedInstanceState) {super.onCreate (savedInstanceState); ActionBar actionBar = getSupportActionBar (); if (actionBar! = null) {actionBar.setDisplayHomeAsUpEnabled (true); actionBar.setTitle (getIntent (). getStringExtra (ACTION_BAR_TITLE)); }} @Kulutage avaliku loogilise teenuse onCreateOptionsMenu (menüümenüü) {getMenuInflater () .puhumine (R.menu.my_menu, menüü); tagasi tõsi; } @Obreerige avaliku loogilise funktsiooni onOptionsItemSelected (üksus MenüüItem) {switch (item.getItemId ()) {// Kui on valitud „gallery_action”, siis ... // juhtum R.id.gallery_action: //...kontroll, mis meil on WRITE_STORAGE luba // checkPermission (WRITE_STORAGE); vaheaeg; } return super.onOptionsItemSelected (üksus); } @Annab avaliku tühise saidilRequestPermissionsResult (int requestCode, @NonNull String õigused, @NonNull int grantResults) {super.onRequestPermissionsResult (requestCode, permissions, grantResults); switch (requestCode) {juhtum WRITE_STORAGE: // Kui loataotlus on antud, siis ... // if (grantResults.length> 0 && grantResults == PackageManager.PERMISSION_GRANTED) {//...kõne SelectPicture // SelectPicture ( ); // Kui loataotlus lükatakse tagasi, siis ... //} muidu {//...näidake stringi “luba_request” // requestPermission (see, requestCode, R.string.permission_request); } vaheaeg; }} // Kuvage loataotluse dialoog // avalik staatiline void requestPermission (lõplik tegevusalane tegevus, lõplik int requestCode, int msg) {AlertDialog.Builder alarm = new AlertDialog.Builder (tegevus); alarm.set (msg); alert.setPositiveButton (android.R.string.ok, uus DialogInterface.OnClickListener () {@Orideeri avalik tühisus onClicki (DialogInterface dialogInterface, int i) {dialogInterface.dismiss (); Intent permissonIntent = uus kavatsus (Settings.ACTION_APPLICATION_DL; .setData (Uri.parse ("pakett:" + tegevus.getPackageName ())); activity.startActivityForResult (permissonIntent, requestCode);}}); alert.setNegativeButton (android.R.string.cancel, uus DialogInterface.OnClickListener () {@Orideeri avalik tühisus onClickil (DialogInterface dialogInterface, int i) {dialogInterface.dismiss ();}}); alert.setCancelable (false); alarm.show (); } // Kontrollige, kas kasutaja on andnud WRITE_STORAGE loa // public void checkPermission (int requestCode) {switch (requestCode) {case WRITE_STORAGE: int hasWriteExternalStoragePermission = ActivityCompat.checkSelfPermission (this, Manifest.permission.WRITE_EXTERNAL_STORAGE) // Kui meil on juurdepääs välisele salvestusruumile ... // if (hasWriteExternalStoragePermission == PackageManager.PERMISSION_GRANTED) {//...kõne SelectPicture, mis käivitab tegevuse, kus kasutaja saab pildi valida // selectPicture (); // Kui luba pole antud, siis ... //} muidu {//...taotlege luba // ActivityCompat.requestPermissions (see on uus string {Manifest.permission.WRITE_EXTERNAL_STORAGE}, requestCode); } vaheaeg; }} privaatne tühine selectPicture () {foto = MyHelper.createTempFile (foto); Kavatsuse kavatsus = uus kavatsus (Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); // Alustage tegevust, kus kasutaja saab pildi valida // startActivityForResult (kavatsus, SELECT_PHOTO); }}

Praegu peaks teie projekt kurtma, et see ei lahenda MyHelper.createTempFile. Rakendame selle kohe!

Piltide suuruse muutmine saidil createTempFile

Looge uus klass „MyHelper”. Selles klassis hakkame muutma kasutaja valitud pildi suurust, mis on teksti töötlemise API-l töötlemiseks valmis.

import android.graphics.Bitmap; impordi android.graphics.BitmapFactory; import android.content.Context; import android.database.Kursor; import android.os.Keskkond; impordi android.widget.ImageView; import android.provider.MediaStore; import android.net.Uri; impordi staatiline android.graphics.BitmapFactory.decodeFile; impordi staatiline android.graphics.BitmapFactory.decodeStream; import java.io.Fail; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; avalik klass MyHelper {public static String getPath (konteksti kontekst, Uri uri) {String path = ""; Stringi projektsioon = {MediaStore.Images.Media.DATA}; Kursori kursor = context.getContentResolver (). Päring (uri, projektsioon, null, null, null); int veeru_indeks; if (kursor! = null) {column_index = cursor.getColumnIndexOrThrow (MediaStore.Images.Media.DATA); cursor.moveToFirst (); tee = kursor.getString (veeru_indeks); cursor.close (); } tagasitee; } avalik staatiline fail createTempFile (failifail) {failikataloog = uus fail (Environment.getExternalStorageDirectory (). getPath () + "/com.jessicathornsby.myapplication"); if (! kataloog.exists () ||! kataloog.isDirectory ()) {kataloog.mkdirs (); } if (fail == null) {fail = uus fail (kataloog, "orig.jpg"); } tagasta fail; } avalik staatiline Bitmap resizePhoto (faili imageFile, konteksti kontekst, Uri uri, ImageView vaade) {BitmapFactory.Options newOptions = new BitmapFactory.Options (); proovige {decodeStream (context.getContentResolver (). openInputStream (uri), null, newOptions); int photoHeight = newOptions.outHeight; int photoWidth = newOptions.outWidth; newOptions.inSampleSize = Math.min (fotolaius / vaade.getlaius (), photoHeight / view.getHeight ()); return compressPhoto (imageFile, BitmapFactory.decodeStream) (context.getContentResolver (). openInputStream (uri), null, newOptions)); } saak (FileNotFoundException erand) {erand.printStackTrace (); tagasi null; }} avalik staatiline Bitmap resizePhoto (faili imageFile, String path, ImageView vaade) {BitmapFactory.Options options = new BitmapFactory.Options (); decodeFile (tee, valikud); int photoHeight = options.outHeight; int photoWidth = options.outWidth; options.inSampleSize = Math.min (fotolaius / vaade.getlaius (), fotoHeight / vaade.getHeight ()); return compressPhoto (imageFile, BitmapFactory.decodeFile (tee, suvandid)); } privaatne staatiline Bitmap compressPhoto (faili photoFile, Bitmap bitmap) {proovige {FileOutputStream fOutput = new FileOutputStream (photoFile); bitmap.compress (Bitmap.CompressFormat.JPEG, 70, fOutput); fOutput.close (); } saak (IOException erand) {erand.printStackTrace (); } tagasi bitmap; }}

Seadke pilt ImageView-le

Järgmisena peame oma MainActivity klassis rakendama onActivityResult () ja seadma kasutaja valitud pildi meie ImageView-le.

import android.graphics.Bitmap; import android.os.Bundle; impordi android.widget.ImageView; import android.content.Intent; impordi android.widget.TextView; import android.net.Uri; avaliku klassi MainActivity laiendab BaseActivity {private Bitmap myBitmap; privaatne ImageView myImageView; privaatne TextView myTextView; @Kuivata kaitstud tühine onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); myTextView = findViewById (R.id.textView); myImageView = findViewById (R.id.imageView); } @Arvesta kaitstud tühine onActivityResult (int requestCode, int tulemusCode, kavatsuse andmed) {super.onActivityResult (requestCode, resultCode, data); if (resultCode == RESULT_OK) {switch (requestCode) {case WRITE_STORAGE: checkPermission (requestCode); vaheaeg; juhtum SELECT_PHOTO: Uri dataUri = data.getData (); Stringi tee = MyHelper.getPath (see, dataUri); if (tee == null) {myBitmap = MyHelper.resizePhoto (foto, see, dataUri, myImageView); } else {myBitmap = MyHelper.resizePhoto (foto, tee, myImageView); } if (myBitmap! = null) {myTextView.setText (null); myImageView.setImageBitmap (myBitmap); } vaheaeg; }}}}

Käivitage see projekt füüsilises Androidi seadmes või AVD-s ja klõpsake toiminguriba ikoonil klõpsuga. Kui küsitakse, andke WRITE_STORAGE luba ja valige pilt galeriist; seda pilti tuleks nüüd kuvada teie rakenduse kasutajaliideses.

Nüüd, kui oleme aluse pannud, oleme valmis alustama teksti ekstraheerimist!

Rakenduse õpetamine teksti äratundmiseks

Soovin käivitada tekstituvastuse vastuseks klõpsamissündmusele, seetõttu peame rakendama OnClickListeneri:

import android.graphics.Bitmap; import android.os.Bundle; impordi android.widget.ImageView; import android.content.Intent; impordi android.widget.TextView; import android.view.View; import android.net.Uri; avaliku klassi MainActivity laiendab BaseActivity rakendusi View.OnClickListener {private Bitmap myBitmap; privaatne ImageView myImageView; privaatne TextView myTextView; @Kuivata kaitstud tühine 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 (see); } @Kulge avaliku tühisuse tühistamine onClickil (vaade) {switch (view.getId ()) {case R.id.checkText: if (myBitmap! = Null) {// Järgmises etapis rakendame runTextRecog // runTextRecog (); } vaheaeg; }}

ML-komplekt saab pilte töödelda ainult siis, kui need on vormingus FirebaseVisionImage, seega peame oma pildi teisendama FirebaseVisionImage-objektiks. FirebaseVisionImage saate luua bitmapist, media.Image, ByteBuffer või baitimassiivist. Kuna töötame bitikaartidega, peame kutsuma klassi FirebaseVisionImage utiliidi fromBitmap () ja edastama selle meie bittkaardiks.

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

ML-komplektil on iga pildi tuvastamise toimingu jaoks erinevad detektoriklassid. Teksti jaoks peame kasutama klassi FirebaseVisionTextDetector, mis teostab pildil optilist märgituvastust (OCR).

Loome FirebaseVisionTextDetector eksemplari, kasutades getVisionTextDetector:

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

Järgmisena peame kontrollima teksti FirebaseVisionImage, helistades meetodile deteInImage () ja edastades sellele objekti FirebaseVisionImage. Peame rakendama ka onSuccessi ja onFailure'i tagasikutsumised ning vastavad kuulajad, et meie rakendust teavitataks, kui tulemused muutuvad kättesaadavaks.

detector.detectInImage (pilt) .addOnSuccessListener (uus OnSuccessListener() {@Override // To do //}}). AddOnFailureListener (uus OnFailureListener () {@Orveride public void onFailure (@NonNull erandi erand)) {// Ülesanne ebaõnnestus erandiga //}}); }

Kui see toiming ebaõnnestub, siis kuvatakse röstsai, kuid kui see toiming õnnestub, kutsun vastusega protsessiExtractedText.

Sel hetkel näeb minu tekstituvastuskood välja järgmine:

// FirebaseVisionImage loomine // private void runTextRecog () {FirebaseVisionImage image = FirebaseVisionImage.fromBitmap (myBitmap); // FirebaseVisionCloudTextDetector eksemplari loomine // FirebaseVisionTextDetector detektor = FirebaseVision.getInstance (). GetVisionTextDetector (); // OnSuccessListeneri registreerimine // detector.detectInImage (pilt) .addOnSuccessListener (uus OnSuccessListener() {@Override // Rakendage onSuccessi tagasihelistamine // Public void onSuccess (FirebaseVisionText tekstid) {// Helistage protsessExtractedText vastusega // processExtractedText (tekstid); }}). addOnFailureListener (uus OnFailureListener () {@Override // Rakendage onFailure'i tagasivõtmine // Avalik tühine onFailure (@NonNull erandi erand)) {Toast.makeText (MainActivity.this "Exception", Toast.LENGTH_LONG) .show ( );}}); }

Kui meie rakendus saab onSuccess-teatise, peame tulemused sõeluma.

Objekt FirebaseVisionText võib sisaldada elemente, ridu ja plokke, kus iga plokk võrdub tavaliselt ühe teksti lõiguga. Kui FirebaseVisionText tagastab 0 plokki, siis kuvame stringi „no_text”, kuid kui see sisaldab ühte või mitut plokki, siis kuvame taastatud teksti meie TextView osana.

privaatne tühine protsessExtractedText (FirebaseVisionText firebaseVisionText) {myTextView.setText (null); if (firebaseVisionText.getBlocks (). suurus () == 0) {myTextView.setText (R.string.no_text); tagasi; } jaoks (FirebaseVisionText.Block plokk: firebaseVisionText.getBlocks ()) {myTextView.append (block.getText ()); }}}

Siin on täielik MainActivity kood:

import android.graphics.Bitmap; import android.os.Bundle; impordi android.widget.ImageView; import android.content.Intent; impordi android.widget.TextView; import android.widget.Toast; import android.view.View; import android.net.Uri; import android.support.annotation.NonNull; impordi com.google.firebase.ml.vision.common.FirebaseVisionImage; impordi com.google.firebase.ml.vision.text.FirebaseVisionText; impordi com.google.firebase.ml.vision.text.FirebaseVisionTextDetector; impordi com.google.firebase.ml.vision.FirebaseVision; impordi com.google.android.gms.tasks.OnSuccessListener; impordi com.google.android.gms.tasks.OnFailureListener; avaliku klassi MainActivity laiendab BaseActivity rakendusi View.OnClickListener {private Bitmap myBitmap; privaatne ImageView myImageView; privaatne TextView myTextView; @Kuivata kaitstud tühine 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 (see); } @Kulge avaliku tühisuse tühistamine saidilClick (Vaade) {switch (view.getId ()) {case R.id.checkText: if (myBitmap! = Null) {runTextRecog (); } vaheaeg; }} @Arvesta kaitstud tühine onActivityResult (int requestCode, int tulemusCode, kavatsuse andmed) {super.onActivityResult (requestCode, resultCode, data); if (resultCode == RESULT_OK) {switch (requestCode) {case WRITE_STORAGE: checkPermission (requestCode); vaheaeg; juhtum SELECT_PHOTO: Uri dataUri = data.getData (); Stringi tee = MyHelper.getPath (see, dataUri); if (tee == null) {myBitmap = MyHelper.resizePhoto (foto, see, dataUri, myImageView); } else {myBitmap = MyHelper.resizePhoto (foto, tee, myImageView); } if (myBitmap! = null) {myTextView.setText (null); myImageView.setImageBitmap (myBitmap); } vaheaeg; }}} privaatne tühine runTextRecog () {FirebaseVisionImage image = FirebaseVisionImage.fromBitmap (myBitmap); FirebaseVisionTextDetector detektor = FirebaseVision.getInstance (). GetVisionTextDetector (); detector.detectInImage (pilt) .addOnSuccessListener (uus OnSuccessListener() {@Kulutage avaliku tühisuse onSuccess (FirebaseVisionText tekstid) {processExtractedText (tekstid); }}). addOnFailureListener (uus OnFailureListener () {@Orride public void onFailure (@NonNull erandi erand)) {Toast.makeText (MainActivity.this, "Exception", Toast.LENGTH_LONG) .show ();}}); } privaatne tühine protsessExtractedText (FirebaseVisionText firebaseVisionText) {myTextView.setText (null); if (firebaseVisionText.getBlocks (). suurus () == 0) {myTextView.setText (R.string.no_text); tagasi; } jaoks (FirebaseVisionText.Block plokk: firebaseVisionText.getBlocks ()) {myTextView.append (block.getText ()); }}}

Projekti katsetamine

Nüüd on aeg näha, kuidas ML-komplekti tekstituvastus töötab! Installige see projekt Android-seadmesse või AVD-sse, valige pilt galeriist ja koputage nuppu „Kontrolli teksti“. Rakendus peaks reageerima, ekstraheerides kogu pildi pildilt ja kuvades seda siis tekstvaates.

Pidage meeles, et sõltuvalt pildi suurusest ja selles sisalduva teksti hulgast peate kogu ekstraheeritud teksti nägemiseks kerima.

Valmis projekti saate alla laadida ka GitHubist.

Pakkimine üles

Nüüd teate ML-komplekti abil, kuidas pildilt teksti tuvastada ja sellest ekstraheerida.

Tekstituvastuse API on vaid üks osa ML-komplektist. See SDK pakub ka vöötkoodi skaneerimist, näotuvastust, piltide märgistamist ja orientiirituvastust, plaanides lisada tavaliste mobiilikasutuse juhtumite jaoks rohkem API-sid, sealhulgas Smart Reply ja suure tihedusega näokontuuri API.

Millist ML Kit API-d olete kõige rohkem huvitatud proovima? Andke meile allolevates kommentaarides teada!

Oktoobri #telefonipokalüpi toodi turule mitu uut kõrgetaemelit telefoni, nende hulga oli võtmetähtuega OnePlu 6T. Väga oodatud OnePlu 6T toob mitu värkendut inna, mi oli ...

Google on ilmelt keelanud rakendute võimalue alvetada kõneid rakendue Android Pie. Kõnealveturakendute arendajad on hakanud kautajaid teavitama hiljutitet muudatutet piruka, mi eemaldav...

Populaarne