Kā iegūt tekstu no attēliem, izmantojot Google Machine Learning SDK

Autors: John Stephens
Radīšanas Datums: 27 Janvārī 2021
Atjaunināšanas Datums: 5 Jūlijs 2024
Anonim
Java Tech Talk: Telegram bot on java for 1 hour
Video: Java Tech Talk: Telegram bot on java for 1 hour

Saturs


Jūs arī varētu izmantot teksta atpazīšanas API kā tulkošanas lietotņu vai piekļuves pakalpojumu bāzi, kur lietotājs var norādīt savu kameru uz jebkuru tekstu, ar kuru viņi cīnās, un likt viņiem to skaļi izlasīt.

Šajā apmācībā mēs izveidosim pamatu visdažādākajām novatoriskajām funkcijām, izveidojot lietotni, kas var iegūt tekstu no jebkura lietotāja galerijā esoša attēla. Lai gan mēs to neaptversim šajā apmācībā, jūs arī varētu reāllaikā uztvert tekstu no lietotāja apkārtnes, savienojot šo lietojumprogrammu ar ierīces kameru.

Ierīcē vai mākonī?

Daži no ML Kit API ir pieejami tikai ierīcē, bet daži ir pieejami gan ierīcē, gan mākonī, ieskaitot teksta atpazīšanas API.

Mākonis balstīta teksta API var identificēt plašāku valodu un rakstzīmju diapazonu, un tā sola lielāku precizitāti nekā tā līdzvērtīgā ierīce ierīcē. Tomēr tā dara nepieciešams aktīvs interneta savienojums, un tas ir pieejams tikai Blaze līmeņa projektiem.


Šajā rakstā teksta atpazīšanas API darbosimies lokāli, lai jūs varētu sekot līdzi neatkarīgi no tā, vai esat jaunināts uz Blaze vai izmantojat bezmaksas Firebase Spark plānu.

Teksta atpazīšanas lietotnes izveidošana, izmantojot ML Kit

Izveidojiet lietojumprogrammu ar izvēlētajiem iestatījumiem, bet, kad tiek parādīts uzaicinājums, atlasiet veidni “Tukša aktivitāte”.

ML Kit SDK ir daļa no Firebase, tāpēc jums būs jāpieslēdz savs projekts Firebase, izmantojot tā parakstīšanas sertifikātu SHA-1. Lai iegūtu projekta SHA-1:

  • Atlasiet Android Studio cilni “Gradle”.
  • Panelī “Gradle projekti” veiciet dubultklikšķi, lai izvērstu projekta sakni, un pēc tam atlasiet “Uzdevumi> Android> Parakstīšanas ziņojums”.
  • Panelis Android Studio loga apakšā ir jāatjaunina, lai parādītu informāciju par šo projektu, ieskaitot tā SHA-1 parakstīšanas sertifikātu.


Lai savienotu savu projektu ar Firebase:

  • Savā tīmekļa pārlūkprogrammā palaidiet Firebase konsoli.
  • Atlasiet “Pievienot projektu”.
  • Piešķiriet savam projektam vārdu; Es izmantoju “ML Test”.
  • Izlasiet noteikumus un nosacījumus, un, ja esat priecīgs turpināt rīkoties, atlasiet “Es piekrītu…”, kam seko “Izveidot projektu”.
  • Atlasiet “Pievienot Firebase savai Android lietotnei”.
  • Ievadiet sava projekta paketes nosaukumu, kuru atradīsit MainActivity faila augšpusē un manifestā.
  • Ievadiet projekta SHA-1 paraksta sertifikātu.
  • Noklikšķiniet uz “Reģistrēt lietotni”.
  • Atlasiet “Lejupielādēt google-services.json”. Šajā failā ir visi jūsu projektam nepieciešamie Firebase metadati, ieskaitot API atslēgu.
  • Programmā Android Studio velciet un nometiet google-services.json failu projekta direktorijā “app”.

  • Atveriet projekta līmeņa build.gradle failu un pievienojiet Google pakalpojumu klases ceļu:

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

  • Atveriet lietotnes līmeņa build.gradle failu un pievienojiet Firebase Core, Firebase ML Vision un modeļa tulka atkarības, kā arī Google pakalpojumu spraudni:

lietot spraudni: com.google.gms.google-pakalpojumi ... ... ... atkarības {ieviešanas failsTrija (rež .: libs, iekļaut:) ieviešana com.google.firebase: firebase-core: 16.0.1 ieviešanas kom. google.firebase: firebase-ml-vision: 16.0.0 ieviešana com.google.firebase: firebase-ml-model-tulks: 16.0.0

Šajā brīdī jums būs jāpalaiž savs projekts, lai tas varētu izveidot savienojumu ar Firebase serveriem:

  • Instalējiet savu lietotni fiziskā Android viedtālrunī vai planšetdatorā vai Android virtuālajā ierīcē (AVD).
  • Firebase konsolē atlasiet “Palaist lietotni, lai pārbaudītu instalēšanu”.
  • Pēc dažiem mirkļiem jums vajadzētu redzēt “Apsveicam”; atlasiet “Turpināt pie pults”.

Lejupielādējiet Google iepriekš apmācītos mašīnmācīšanās modeļus

Pēc noklusējuma ML Kit lejupielādē modeļus tikai pēc nepieciešamības, tāpēc mūsu lietotne lejupielādēs OCR modeli, kad lietotājs pirmo reizi mēģina izvilkt tekstu.

Tas potenciāli varētu negatīvi ietekmēt lietotāju pieredzi - iedomājieties, ka mēģināt piekļūt funkcijai, tikai lai atklātu, ka lietotnei ir jāielādē vairāk resursu, pirms tā faktiski var piegādāt šo funkciju. Sliktākajā gadījumā jūsu lietotne var pat nespēt lejupielādēt tai nepieciešamos resursus, kad tā tiem nepieciešama, piemēram, ja ierīcei nav interneta savienojuma.

Lai pārliecinātos, ka tas nenotiek ar mūsu lietotni, instalēšanas laikā lejupielādēsim nepieciešamo OCR modeli, kam ir jāveic dažas izmaiņas Maniest.

Kamēr mums būs manifests atvērts, es arī pievienosim WRITE_EXTERNAL_STORAGE atļauju, kuru mēs vēlāk izmantosim šajā apmācībā.

// Pievienojiet WRITE_EXTERNAL_STORAGE atļauju // // Pievienojiet šo tekstu //

Izkārtojuma veidošana

Izņemsim vienkāršos priekšmetus un izveidosim izkārtojumu, kas sastāv no:

  • ImageView. Sākumā tas parādīs vietturi, bet tas tiks atjaunināts, tiklīdz lietotājs no savas galerijas izvēlas attēlu.
  • Poga, kas aktivizē teksta iegūšanu.
  • TextView, kurā parādīsim iegūto tekstu.
  • ScrollView. Tā kā nav garantijas, ka izvilktais teksts būs precīzi piemērots ekrānam, es ievietosšu TextView ScrollView.

Šis ir pabeigtais darbības_main.xml fails:

Šis izkārtojums norāda uz “ic_placeholder” zīmējumu, tāpēc izveidosim to tūlīt:

  • Android Studio rīkjoslā atlasiet “Fails> Jauns> Image Asset”.
  • Atveriet nolaižamo izvēlni “Icon Type” un atlasiet “Action Bar and Tab Icons”.
  • Pārliecinieties, vai ir atlasīta radiopoga “Clip Art”.
  • Noklikšķiniet uz pogas “Clip Art”.
  • Atlasiet attēlu, kuru vēlaties izmantot kā vietturi; Es izmantoju “Pievienot fotoattēliem”.
  • Noklikšķiniet uz “Labi”.
  • Atveriet nolaižamo izvēlni Tēma un atlasiet “HOLO_LIGHT”.
  • Laukā “Nosaukums” ievadiet “ic_placeholder”.
  • Noklikšķiniet uz Tālāk. Izlasiet informāciju un, ja jūs ar prieku turpiniet, noklikšķiniet uz Pabeigt.

Darbības joslas ikonas: tiek palaista lietotne Galerija

Pēc tam es izveidošu darbību joslas vienumu, kas atvērs lietotāja galeriju un būs gatavs tam, lai viņš izvēlētos attēlu.

Jūs definējat darbības joslas ikonas izvēlnes resursa failā, kas atrodas direktorijā “res / menu”. Ja jūsu projektā nav šī direktorija, jums tas būs jāizveido:

  • Ar vadības taustiņu noklikšķiniet uz projekta direktorija “res” un atlasiet “Jauns> Android resursu direktorijs”.
  • Atveriet nolaižamo izvēlni “Resursa tips” un atlasiet “izvēlne”.
  • Direktorija nosaukumam vajadzētu automātiski atjaunināties uz izvēlni, taču, ja tā nav, tas jāpārdēvē manuāli.
  • Noklikšķiniet uz “Labi”.

Tagad esat gatavs izveidot izvēlnes resursa failu:

  • Ar vadības taustiņu noklikšķiniet uz sava projekta izvēlnes direktorijas un atlasiet “Jauns> Izvēlnes resursa fails”.
  • Nosauciet šo failu kā “my_menu”.
  • Noklikšķiniet uz “Labi”.
  • Atveriet failu “my_menu.xml” un pievienojiet:

// Izveidot elements katrai darbībai //

Izvēlnes failā ir atsauce uz virkni “action_gallery”, tāpēc atveriet projekta res / vērtības / strings.xml failu un izveidojiet šo resursu. Esot šeit, es definēju arī citas virknes, kuras mēs izmantosim visā šajā projektā.

Galerija Šai lietotnei ir jāpiekļūst ierīces failiem. Nav atrasts teksts

Pēc tam izmantojiet Image Asset Studio, lai izveidotu darbību joslas ikonu “ic_gallery”:

  • Atlasiet “File> New> Image Asset”.
  • Iestatiet nolaižamo izvēlni “Ikona tips” uz “Darbības joslas un cilnes ikonas”.
  • Noklikšķiniet uz pogas “Clip Art”.
  • Izvēlieties zīmējumu; Es izmantoju “attēlu”.
  • Noklikšķiniet uz “Labi”.
  • Lai pārliecinātos, ka šī ikona ir skaidri redzama darbību joslā, atveriet nolaižamo izvēlni “Tēma” un atlasiet “HOLO_DARK”.
  • Nosauciet šo ikonu “ic_gallery”.
  • “Noklikšķiniet uz Next, kam seko“ Finish ”.

Darbs ar atļauju pieprasījumiem un klikšķu notikumiem

Es gatavošos veikt visus uzdevumus, kas nav tieši saistīti ar teksta atpazīšanas API, atsevišķā BaseActivity klasē, ieskaitot tūlītēju izvēlnes aktivizēšanu, darbību joslas klikšķu notikumu apstrādi un piekļuves pieprasīšanu ierīces krātuvei.

  • Android Studio rīkjoslā atlasiet “Fails> Jauns> Java klase”.
  • Nosauciet šo klasi “BaseActivity”.
  • Noklikšķiniet uz “Labi”.
  • Atveriet BaseActivity un pievienojiet šo:

importēt android.app.Aktivitāte; importēt android.support.v4.app.ActivityCompat; importēt android.support.v7.app.ActionBar; importēt android.support.v7.app.AlertDialog; importēt android.support.v7.app.AppCompatActivity; importa android.os.Bundle; importēt android.content.DialogInterface; importa android.content.Intent; import android.Manifest; importa android.provider.MediaStore; importa android.view.Menu; importa android.view.MenuItem; importēt android.content.pm.PackageManager; importēt android.net.Uri; import android.provider.Settings; importēt android.support.annotation.NonNull; importēt android.support.annotation.Nullable; importa java.io.Fails; publiskās klases BaseActivity paplašina AppCompatActivity {public static final int WRITE_STORAGE = 100; publisks statiskais galīgais int SELECT_PHOTO = 102; publiski statiskā gala virkne ACTION_BAR_TITLE = "action_bar_title"; publisks faila foto; @Override aizsargāts tukšums onCreate (@Nullable Bundle savedInstanceState) {super.onCreate (savedInstanceState); ActionBar actionBar = getSupportActionBar (); if (actionBar! = null) {actionBar.setDisplayHomeAsUpEnabled (true); actionBar.setTitle (getIntent (). getStringExtra (ACTION_BAR_TITLE)); }} @ Pārvērtēt publisko Būla onCreateOptionsMenu (izvēlnes izvēlne) {getMenuInflater (). Uzpūst (R.menu.my_menu, izvēlne); atgriezties taisnība; } @Orride publiskā Būla onOptionsItemSelected (vienums MenuItem) {switch (item.getItemId ()) {// Ja ir atlasīta “gallery_action”, tad ... // lieta R.id.gallery_action: //...pārbaudiet, vai mums ir WRITE_STORAGE atļauja // checkPermission (WRITE_STORAGE); pārtraukums; } atgriezt super.onOptionsItemSelected (prece); } @Orride public void onRequestPermissionsResult (int requestCode, @NonNull String permissions, @NonNull int grantResults) {super.onRequestPermissionsResult (requestCode, permissions, grantResults); slēdzis (requestCode) {gadījums WRITE_STORAGE: // Ja atļaujas pieprasījums tiek piešķirts, tad ... // if (grantResults.length> 0 && grantResults == PackageManager.PERMISSION_GRANTED) {//...zvans selectPicture // selectPicture ( ); // Ja atļaujas pieprasījums tiek noraidīts, tad ... //} cits {//...demonstrē virkni “luba_request” // requestPermission (šī, requestCode, R.string.permission_request); } pārtraukums; }} // Attēlot atļauju pieprasījuma dialogu // public static void requestPermission (pēdējā darbības aktivitāte, galīgā int requestCode, int msg) {AlertDialog.Builder alert = new AlertDialog.Builder (darbība); brīdinājums.iestatījums (msg); alert.setPositiveButton (android.R.string.ok, jaunais DialogInterface.OnClickListener () {@Override public void onClick (DialogInterface dialogInterface, int i) {dialogInterface.dismiss (); Intent permissonIntent = jauns nodoms (Settings.ACTION_APPLICATION_Daint; .setData (Uri.parse ("pakete:" + activity.getPackageName ())); activity.startActivityForResult (permissonIntent, requestCode);}}); alert.setNegativeButton (android.R.string.cancel, jaunais DialogInterface.OnClickListener () {@Override public void onClick (DialogInterface dialogInterface, int i) {dialogInterface.dismiss ();}}); alert.setCancelable (nepatiess); alert.show (); } // Pārbaudiet, vai lietotājs ir piešķīris WRITE_STORAGE atļauju // public void checkPermission (int requestCode) {switch (requestCode) {case WRITE_STORAGE: int hasWriteExternalStoragePermission = ActivityCompat.checkSelfPermission (this, Manifest.permission.WRITE_EXTERNAL_STORAGE); // Ja mums ir pieeja ārējai krātuvei ... // if (hasWriteExternalStoragePermission == PackageManager.PERMISSION_GRANTED) {//...zvanīt selectPicture, kas uzsāk darbību, kurā lietotājs var izvēlēties attēlu // selectPicture (); // Ja atļauja nav piešķirta, tad ... //} cits {//...pieprasiet atļauju // ActivityCompat.requestPermissions (šī ir jaunā virkne {Manifest.permission.WRITE_EXTERNAL_STORAGE}, requestCode); } pārtraukums; }} privāts tukšums selectPicture () {photo = MyHelper.createTempFile (foto); Nodomu nodoms = jauns nodoms (Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); // Sāciet darbību, kurā lietotājs var izvēlēties attēlu // startActivityForResult (nodoms, SELECT_PHOTO); }}

Šajā brīdī jūsu projektam vajadzētu sūdzēties, ka tas nevar atrisināt MyHelper.createTempFile. Īstenosim to tūlīt!

Attēlu mainīšana, izmantojot createTempFile

Izveidojiet jaunu “MyHelper” klasi. Šajā klasē mēs mainīsim lietotāja izvēlētā attēla lielumu, kas ir gatavs apstrādei ar teksta atpazīšanas API.

importēt android.graphics.Bitmap; importēt android.graphics.BitmapFactory; importa android.content.Context; importēt android.database.Cursor; importa android.os.Vide; importēt android.widget.ImageView; importa android.provider.MediaStore; importēt android.net.Uri; importēt statisku android.graphics.BitmapFactory.decodeFile; importēt statisku android.graphics.BitmapFactory.decodeStream; importa java.io.Fails; importa java.io.FileNotFoundException; importēt java.io.FileOutputStream; importa java.io.IOException; sabiedrības klase MyHelper {public static String getPath (konteksta konteksts, Uri uri) {String path = ""; Stīgu projekcija = {MediaStore.Images.Media.DATA}; Kursora kursors = context.getContentResolver (). Vaicājums (uri, projekcija, null, null, null); int kolonna_index; if (kursors! = nulle) {column_index = cursor.getColumnIndexOrThrow (MediaStore.Images.Media.DATA); cursor.moveToFirst (); ceļš = cursor.getString (column_index); cursor.close (); } atgriešanās ceļš; } publisks statisks fails createTempFile (faila fails) {Failu direktorijs = jauns fails (Environment.getExternalStorageDirectory (). getPath () + "/com.jessicathornsby.myapplication"); if (! directory.exists () ||! directory.isDirectory ()) {directory.mkdirs (); } if (fails == null) {fails = jauns fails (direktorija, "orig.jpg"); } atgriešanas fails; } publisks statisks Bitmap resizePhoto (faila imageFile, konteksta konteksts, Uri uri, ImageView skats) {BitmapFactory.Options newOptions = new BitmapFactory.Options (); izmēģiniet {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 ()); atgriezt compressPhoto (imageFile, BitmapFactory.decodeStream (context.getContentResolver (). openInputStream (uri), null, newOptions)); } noķert (FileNotFoundException izņēmums) {poikkejums.printStackTrace (); atgriezt null; }} publiski statiskā Bitmap resizePhoto (faila imageFile, virknes ceļš, ImageView skats) {BitmapFactory.Options options = new BitmapFactory.Options (); decodeFile (ceļš, iespējas); int photoHeight = options.outHeight; int photoWidth = options.outWidth; options.inSampleSize = Math.min (photoWidth / view.getWidth (), photoHeight / view.getHeight ()); atgriešanās compressPhoto (imageFile, BitmapFactory.decodeFile (ceļš, opcijas)); } privāta statiskā Bitmap compressPhoto (File photoFile, Bitmap bitmap) {mēģiniet {FileOutputStream fOutput = new FileOutputStream (photoFile); bitmap.compress (Bitmap.CompressFormat.JPEG, 70, fOutput); fOutput.close (); } nozveja (IOException izņēmums) {poikkejums.printStackTrace (); } atgriešanās bitkarte; }}

Iestatiet attēlu uz ImageView

Pēc tam mūsu MainActivity klasē jāievieš onActivityResult () un lietotāja izvēlētajam attēlam jāiestata mūsu ImageView.

importēt android.graphics.Bitmap; importa android.os.Bundle; importēt android.widget.ImageView; importa android.content.Intent; importēt android.widget.TextView; importēt android.net.Uri; publiskās klases MainActivity paplašina BaseActivity {private Bitmap myBitmap; privāts ImageView myImageView; privāts TextView myTextView; @Override aizsargāts tukšums onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); myTextView = findViewById (R.id.textView); myImageView = findViewById (R.id.imageView); } @Override aizsargāts tukšums onActivityResult (int requestCode, int rezultātsCode, Intent data) {super.onActivityResult (requestCode, rezultātsCode, dati); if (resultCode == RESULT_OK) {switch (requestCode) {case WRITE_STORAGE: checkPermission (requestCode); pārtraukums; gadījums SELECT_PHOTO: Uri dataUri = data.getData (); Virknes ceļš = MyHelper.getPath (šis, dataUri); if (ceļš == nulle) {myBitmap = MyHelper.resizePhoto (foto, šis, dataUri, myImageView); } else {myBitmap = MyHelper.resizePhoto (foto, ceļš, myImageView); } if (myBitmap! = null) {myTextView.setText (null); myImageView.setImageBitmap (myBitmap); } pārtraukums; }}}}

Palaidiet šo projektu fiziskā Android ierīcē vai AVD un noklikšķiniet uz darbības joslas ikonas. Pēc pieprasījuma piešķiriet WRITE_STORAGE atļauju un izvēlieties attēlu no galerijas; šis attēls tagad ir jāparāda jūsu lietotnes lietotāja saskarnē.

Tagad esam sagatavojuši pamatus un esam gatavi sākt iegūt tekstu!

Lietotnes mācīšana teksta atpazīšanai

Es gribu aktivizēt teksta atpazīšanu, reaģējot uz klikšķa notikumu, tāpēc mums jāievieš OnClickListener:

importēt android.graphics.Bitmap; importa android.os.Bundle; importēt android.widget.ImageView; importa android.content.Intent; importēt android.widget.TextView; importa android.view.View; importēt android.net.Uri; sabiedriskās klases MainActivity paplašina BaseActivity ievieš View.OnClickListener {private Bitmap myBitmap; privāts ImageView myImageView; privāts TextView myTextView; @Override aizsargāts tukšums 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 (šis); } @ Pārsniegt publisku anulēšanu onClick (skata skats) {switch (view.getId ()) {case R.id.checkText: if (myBitmap! = Null) {// Nākamajā solī mēs ieviesīsim runTextRecog // runTextRecog (); } pārtraukums; }}

ML komplekts var apstrādāt attēlus tikai tad, kad tie ir FirebaseVisionImage formātā, tāpēc mums ir jāpārveido mūsu attēls objektā FirebaseVisionImage. Jūs varat izveidot FirebaseVisionImage no Bitmap, media.Image, ByteBuffer vai baitu masīva. Tā kā mēs strādājam ar bitkartēm, mums jāizsauc no FirebaseVisionImage klases utilītas metode fromBitmap () un jānodod tā mūsu bitkartei.

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

ML Kit katrai attēla atpazīšanas operācijai ir dažādas detektoru klases. Teksta sagatavošanai mums jāizmanto klase FirebaseVisionTextDetector, kas attēlam veic optisko rakstzīmju atpazīšanu (OCR).

Mēs izveidojam FirebaseVisionTextDetector gadījumu, izmantojot getVisionTextDetector:

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

Tālāk mums jāpārbauda FirebaseVisionImage teksts, piezvanot uz metodi meetodIntegnImage () un nododot to objektam FirebaseVisionImage. Mums jāievieš arī onSuccess un onFailure atzvanīšana, kā arī atbilstošie klausītāji, lai mūsu lietotne tiktu informēta, kad rezultāti būs pieejami.

detector.detectInImage (attēls) .addOnSuccessListener (jauns OnSuccessListener() {@Override // To do //}}). AddOnFailureListener (new OnFailureListener () {@Override public void onFailure (@NonNull Exception izņēmums) {// Uzdevums neizdevās ar izņēmumu //}}); }

Ja šī operācija neizdodas, es parādīšu grauzdiņus, bet, ja operācija ir veiksmīga, es ar atbildi piezvanīšu processExtractedText.

Šajā brīdī mans teksta noteikšanas kods izskatās šādi:

// Izveidot FirebaseVisionImage // private void runTextRecog () {FirebaseVisionImage image = FirebaseVisionImage.fromBitmap (myBitmap); // Izveidojiet FirebaseVisionCloudTextDetector gadījumu // FirebaseVisionTextDetector detektors = FirebaseVision.getInstance (). GetVisionTextDetector (); // Reģistrējiet OnSuccessListener // detector.detectInImage (attēls) .addOnSuccessListener (jauns OnSuccessListener)() {@Override // Ieviest onSuccess atzvanīšanu // public void onSuccess (FirebaseVisionText teksti) {// Zvanīt processExtractedText ar atbildi // processExtractedText (teksti); }). addOnFailureListener (jauns OnFailureListener () {@Override // Ieviest onFailure calback // public void onFailure (@NonNull izņēmuma izņēmums) {Toast.makeText (MainActivity.this, "Exception", Toast.LENGTH_LONG) .show ( );}}); }

Ikreiz, kad mūsu lietotne saņem onSuccess paziņojumu, mums ir jāizanalizē rezultāti.

Objekts FirebaseVisionText var saturēt elementus, līnijas un blokus, kur katrs bloks parasti ir vienāds ar vienu teksta rindkopu. Ja FirebaseVisionText atgriež 0 blokus, mēs parādīsim virkni “no_text”, bet, ja tajā ir viens vai vairāki bloki, izgūto tekstu mēs parādīsim kā mūsu TextView daļu.

privāts nederīgs processExtractedText (FirebaseVisionText firebaseVisionText) {myTextView.setText (null); if (firebaseVisionText.getBlocks (). size () == 0) {myTextView.setText (R.string.no_text); atgriešanās; } for (FirebaseVisionText.Block block: firebaseVisionText.getBlocks ()) {myTextView.append (block.getText ()); }}}

Šis ir pabeigtais MainActivity kods:

importēt android.graphics.Bitmap; importa android.os.Bundle; importēt android.widget.ImageView; importa android.content.Intent; importēt android.widget.TextView; importēt android.widget.Toast; importa android.view.View; importēt android.net.Uri; importēt android.support.annotation.NonNull; importējiet com.google.firebase.ml.vision.common.FirebaseVisionImage; importēt com.google.firebase.ml.vision.text.FirebaseVisionText; importējiet com.google.firebase.ml.vision.text.FirebaseVisionTextDetector; importējiet com.google.firebase.ml.vision.FirebaseVision; importējiet com.google.android.gms.tasks.OnSuccessListener; importējiet com.google.android.gms.tasks.OnFailureListener; sabiedriskās klases MainActivity paplašina BaseActivity ievieš View.OnClickListener {private Bitmap myBitmap; privāts ImageView myImageView; privāts TextView myTextView; @Override aizsargāts tukšums 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 (šis); } @ Pārspēt publisko anulēšanu onClick (Skatīt skatu) {switch (view.getId ()) {case R.id.checkText: if (myBitmap! = Null) {runTextRecog (); } pārtraukums; }} @Override aizsargāts tukšums onActivityResult (int requestCode, int rezultātsCode, nodomu dati) {super.onActivityResult (requestCode, rezultātsCode, dati); if (resultCode == RESULT_OK) {switch (requestCode) {case WRITE_STORAGE: checkPermission (requestCode); pārtraukums; gadījums SELECT_PHOTO: Uri dataUri = data.getData (); Virknes ceļš = MyHelper.getPath (šis, dataUri); if (ceļš == nulle) {myBitmap = MyHelper.resizePhoto (foto, šis, dataUri, myImageView); } else {myBitmap = MyHelper.resizePhoto (foto, ceļš, myImageView); } if (myBitmap! = null) {myTextView.setText (null); myImageView.setImageBitmap (myBitmap); } pārtraukums; }}} privāts tukšums runTextRecog () {FirebaseVisionImage image = FirebaseVisionImage.fromBitmap (myBitmap); FirebaseVisionTextDetector detektors = FirebaseVision.getInstance (). GetVisionTextDetector (); detector.detectInImage (attēls) .addOnSuccessListener (jauns OnSuccessListener() {@Pārsniegt publisku spēkā neesamību onSuccess (FirebaseVisionText teksti) {processExtractedText (teksti); })). addOnFailureListener (jauns OnFailureListener () {@Override public void onFailure (@NonNull Exception izņēmums) {Toast.makeText (MainActivity.this, "Exception", Toast.LENGTH_LONG) .show ();}}); } privāts nederīgs processExtractedText (FirebaseVisionText firebaseVisionText) {myTextView.setText (null); if (firebaseVisionText.getBlocks (). size () == 0) {myTextView.setText (R.string.no_text); atgriešanās; } for (FirebaseVisionText.Block block: firebaseVisionText.getBlocks ()) {myTextView.append (block.getText ()); }}}

Projekta pārbaude

Tagad ir laiks redzēt darbībā ML Kit teksta atpazīšanu! Instalējiet šo projektu Android ierīcē vai AVD, izvēlieties attēlu no galerijas un pēc tam pieskarieties pogai “Pārbaudīt tekstu”. Lietotnei vajadzētu atbildēt, no attēla izvelkot visu tekstu un pēc tam parādot to TextView.

Ņemiet vērā: atkarībā no attēla lieluma un tajā esošā teksta daudzuma jums, iespējams, vajadzēs ritināt, lai redzētu visu iegūto tekstu.

Jūs varat arī lejupielādēt pabeigto projektu no GitHub.

Iesaiņošana

Tagad jūs zināt, kā noteikt un iegūt attēlu no attēla, izmantojot ML Kit.

Teksta atpazīšanas API ir tikai viena ML komplekta sastāvdaļa. Šis SDK piedāvā arī svītrkodu skenēšanu, sejas noteikšanu, attēlu marķēšanu un orientieru atpazīšanu, plānojot pievienot vairāk API saskarnei ar mobilajām ierīcēm, ieskaitot Smart Reply un augsta blīvuma sejas kontūras API.

Kura ML Kit API jūs visvairāk interesē izmēģināt? Paziņojiet mums komentāros zemāk!

Ir pagājui forša minūte, kopš ļaudi, ka atroda aiz Puhbullet, izlaida būtiku atjauninājumu, bet ta šodien mainā.Galvenā iezīme ir atjaunotā Material Deign etētika, ka hamburgera izvēlni aiztāj ar apak...

Lai āktu darbu ar PureVPN, jum bū jāizveido kont, norādot avu vārdu un e-pata adrei. E-pata adree nav nepieciešama, lai pieteikto PureVPN lietotnē, un jum nav jāietata parole....

Vislielākais Lasījums