Kaip iš „Google“ mašinų mokymosi SDK ištraukti tekstą iš vaizdų

Autorius: John Stephens
Kūrybos Data: 27 Sausio Mėn 2021
Atnaujinimo Data: 5 Liepos Mėn 2024
Anonim
How to extract text from images using EasyOCR Python Library (Deep Learning)
Video.: How to extract text from images using EasyOCR Python Library (Deep Learning)

Turinys


Taip pat galite naudoti teksto atpažinimo API kaip vertimo programų ar pritaikymo neįgaliesiems paslaugų pagrindą, kai vartotojas gali nukreipti savo kamerą į bet kurį tekstą, su kuriuo jie susiduria, ir leisti garsiai perskaityti jį.

Šiame vadove mes pamatysime daugybę novatoriškų funkcijų, sukurdami programą, galinčią ištraukti tekstą iš bet kurio vartotojo galerijos vaizdo. Nors mes to nenagrinėsime šiame vadove, taip pat realiuoju laiku galėtumėte užfiksuoti tekstą iš vartotojo aplinkos, prijungdami šią programą prie įrenginio fotoaparato.

Įrenginyje ar debesyje?

Kai kurios „ML Kit“ API yra prieinamos tik įrenginyje, tačiau kelios yra ir įrenginyje bei debesyje, įskaitant teksto atpažinimo API.

Debesis paremta „Text API“ gali atpažinti platesnį kalbų ir simbolių diapazoną ir žada didesnį tikslumą nei jos atitiktis įrenginyje. Vis dėlto daro reikalauja aktyvaus interneto ryšio ir yra prieinamas tik „Blaze“ lygio projektams.


Šiame straipsnyje mes valdysime teksto atpažinimo API vietoje, taigi galėsite sekti kartu, nepaisant to, ar atnaujinote „Blaze“, ar naudojate nemokamą „Firebase Spark“ planą.

Kurti teksto atpažinimo programą naudojant „ML Kit“

Sukurkite programą su pasirinktais parametrais, tačiau kai būsite paraginti, pasirinkite šabloną „Tuščia veikla“.

„ML Kit SDK“ yra „Firebase“ dalis, todėl turėsite prijungti savo projektą prie „Firebase“ naudodami SHA-1 pasirašymo sertifikatą. Norėdami gauti projekto SHA-1:

  • Pasirinkite „Android Studio“ skirtuką „Gradle“.
  • Skydelyje „Gradle projektai“ dukart spustelėkite, kad išplėstumėte projekto „šaknį“, ir tada pasirinkite „Užduotys>„ Android “> Pasirašymo ataskaita“.
  • Skydelis, esantis „Android Studio“ lango apačioje, turėtų būti atnaujintas, kad būtų rodoma tam tikra informacija apie šį projektą, įskaitant jo SHA-1 pasirašymo sertifikatą.


Norėdami prijungti savo projektą prie „Firebase“:

  • Savo interneto naršyklėje paleiskite „Firebase“ konsolę.
  • Pasirinkite „Pridėti projektą“.
  • Duokite savo projekto pavadinimą; Aš naudoju „ML Test“.
  • Perskaitykite taisykles ir nuostatas, o jei jums malonu tęsti, tada pasirinkite „Sutinku…“, po to „Kurti projektą“.
  • Pasirinkite „Pridėti„ Firebase “prie„ Android “programos.“
  • Įveskite projekto paketo pavadinimą, kurį rasite „MainActivity“ failo viršuje ir manifesto viduje.
  • Įveskite projekto SHA-1 pasirašymo pažymėjimą.
  • Spustelėkite „Užregistruoti programą“.
  • Pasirinkite „Atsisiųsti google-services.json“. Šiame faile yra visi jūsų projektui būtini „Firebase“ metaduomenys, įskaitant API raktą.
  • „Android Studio“ nuvilkite „Google“ services.json failą į savo projekto katalogą „app“.

  • Atidarykite projekto lygio „build.gradle“ failą ir pridėkite „Google“ paslaugų klasės kelią:

„classpath com.google.gms“: „Google“ paslaugos: 4.0.1

  • Atidarykite programos lygio „build.gradle“ failą ir pridėkite „Firebase Core“, „Firebase ML Vision“ ir modelio interpretatorių priklausomybes bei „Google“ paslaugų papildinį:

pritaikyti papildinį: com.google.gms.google-paslaugos ... ... ... priklausomybės {diegimo failasTrija (rež .: libs, įtraukti:) diegimas com.google.firebase: firebase-core: 16.0.1 diegimo kom. google.firebase: firebase-ml-vision: 16.0.0 diegimas com.google.firebase: firebase-ml-model-interpreter: 16.0.0

Šiuo metu turėsite paleisti savo projektą, kad jis galėtų prisijungti prie „Firebase“ serverių:

  • Įdiekite programą į fizinį „Android“ išmanųjį telefoną ar planšetinį kompiuterį arba „Android“ virtualųjį įrenginį (AVD).
  • „Firebase“ konsolėje pasirinkite „Vykdyti programą, kad patikrintumėte diegimą“.
  • Po kelių akimirkų turėtumėte pamatyti „Sveikinimai“; pasirinkite „Tęsti prie pulto“.

Atsisiųskite „Google“ iš anksto apmokytus mašinų mokymosi modelius

Pagal numatytuosius nustatymus „ML Kit“ atsisiunčia modelius tik tada, kai jų reikia, todėl mūsų programa atsisiųs OCR modelį, kai vartotojas pirmą kartą bandys išgauti tekstą.

Tai gali turėti neigiamos įtakos vartotojo patirčiai - įsivaizduokite, kad bandote pasiekti funkciją, kad sužinotumėte, jog programa turi atsisiųsti daugiau išteklių, kad galėtų iš tikrųjų pristatyti šią funkciją. Blogiausiu atveju jūsų programa gali net negalėti atsisiųsti reikalingų išteklių, kai jiems jų reikia, pavyzdžiui, jei įrenginyje nėra interneto ryšio.

Norėdami įsitikinti, kad taip neatsitiks su mūsų programa, įdiegimo metu atsisiųsiu reikiamą OCR modelį, kuriam reikia šiek tiek pakeisti „Maniest“.

Kol manifestas yra atidarytas, aš taip pat pridėsiu WRITE_EXTERNAL_STORAGE leidimą, kurį vėliau naudosime šioje mokymo programoje.

// Pridėti WRITE_EXTERNAL_STORAGE leidimą // // Įrašykite taip //

Pastato išdėstymas

Išmeskime paprastus dalykus ir sukurkime išdėstymą, kurį sudaro:

  • „ImageView“. Iš pradžių jame bus rodoma vietos žymeklis, tačiau jis bus atnaujintas, kai vartotojas pasirinks vaizdą iš savo galerijos.
  • Mygtukas, kuris suaktyvina teksto išskleidimą.
  • „TextView“, kur rodysime ištrauktą tekstą.
  • „ScrollView“. Kadangi negarantuojame, kad išgautas tekstas bus tinkamas ekrane, aš ketinu „TextView“ įdėti į „ScrollView“.

Štai baigtas failas activity_main.xml:

Šis išdėstymas nurodo piešinį „ic_placeholder“, todėl sukurkime tai dabar:

  • „Android Studio“ įrankių juostoje pasirinkite „Failas> Naujas> Vaizdo rinkinys“.
  • Atidarykite išskleidžiamąjį meniu „Piktogramos tipas“ ir pasirinkite „Veiksmų juosta ir skirtukų piktogramos“.
  • Įsitikinkite, kad pasirinktas radijo mygtukas „Clip Art“.
  • Spustelėkite mygtuką „Iliustracija“.
  • Pasirinkite vaizdą, kurį norite naudoti kaip vietos rezervuarą; Aš naudoju „Pridėti prie nuotraukų“.
  • Spustelėkite „Gerai“.
  • Atidarykite išskleidžiamąjį meniu „Tema“ ir pasirinkite „HOLO_LIGHT“.
  • Lauke „Vardas“ įveskite „ic_placeholder“.
  • Spustelėkite „Kitas“. Perskaitykite informaciją ir, jei su malonumu tęsite, spustelėkite „Baigti“.

Veiksmų juostos piktogramos: paleiskite programą „Galerija“

Tada aš sukursiu veiksmo juostos elementą, kuris paleis vartotojo galeriją, parengtą jiems pasirinkti atvaizdą.

Apibrėžkite veiksmo juostos piktogramas meniu šaltinio faile, esančiame „res / menu“ kataloge. Jei jūsų projekte nėra šio katalogo, turėsite jį sukurti:

  • Valdiklyje spustelėkite projekto „res“ katalogą ir pasirinkite „Naujas>„ Android “išteklių katalogas“.
  • Atidarykite išskleidžiamąjį meniu „Šaltinio tipas“ ir pasirinkite „meniu“.
  • „Katalogo pavadinimas“ turėtų būti automatiškai atnaujinamas į „meniu“, tačiau jei jo nėra, turėsite jį pervardyti rankiniu būdu.
  • Spustelėkite „Gerai“.

Dabar esate pasiruošę sukurti meniu šaltinio failą:

  • Kontroliniu būdu spustelėkite projekto katalogą „meniu“ ir pasirinkite „Naujas> Meniu išteklių failas“.
  • Pavadinkite šį failą „mano_meniu“.
  • Spustelėkite „Gerai“.
  • Atidarykite failą „my_menu.xml“ ir pridėkite:

// Sukurkite kiekvieno veiksmo elementas //

Meniu failas nurodo „action_gallery“ eilutę, todėl atidarykite projekto res / reikšmės / strings.xml failą ir sukurkite šį šaltinį. Būdamas čia, taip pat apibrėžiu kitas stygas, kurias naudosime šiame projekte.

Galerija Ši programa turi pasiekti jūsų įrenginio failus. Nerastas tekstas

Tada naudokite „Image Asset Studio“, kad sukurtumėte veiksmo juostos „ic_gallery“ piktogramą:

  • Pasirinkite „Failas> Naujas> Vaizdo rinkinys“.
  • Išskleidžiamąjį meniu „Piktogramos tipas“ nustatykite į „Veiksmų juostos ir skirtukų piktogramos“.
  • Spustelėkite mygtuką „Iliustracija“.
  • Pasirinkite piešinį; Aš naudoju „atvaizdą“.
  • Spustelėkite „Gerai“.
  • Norėdami įsitikinti, kad ši piktograma aiškiai matoma veiksmų juostoje, atidarykite išskleidžiamąjį meniu „Tema“ ir pasirinkite „HOLO_DARK“.
  • Pavadinkite šią piktogramą „ic_gallery“.
  • „Spustelėkite„ Kitas “, po to -„ Baigti “.

Tvarkome leidimų užklausas ir spustelėkite įvykius

Aš atliksiu visas užduotis, kurios nėra tiesiogiai susijusios su teksto atpažinimo API, atskiroje „BaseActivity“ klasėje, įskaitant meniu suaktyvinimą, veiksmų juostos paspaudimų įvykių tvarkymą ir užklausą dėl prieigos prie įrenginio saugyklos.

  • „Android Studio“ įrankių juostoje pasirinkite „Failas> Nauja>„ Java “klasė“.
  • Pavadinkite šią klasę „BaseActivity“.
  • Spustelėkite „Gerai“.
  • Atidarykite „BaseActivity“ ir pridėkite:

importuoti „android.app.Activity“; importuoti „android.support.v4.app.ActivityCompat“; importuoti „android.support.v7.app.ActionBar“; importuoti „android.support.v7.app.AlertDialog“; importuoti „android.support.v7.app.AppCompatActivity“; importuoti android.os.Bundle; importuoti „android.content.DialogInterface“; importuoti android.content.Intent; import android.manifest; importuoti „android.provider.MediaStore“; importuoti android.view.Menu; import android.view.MenuItem; importuoti „android.content.pm.PackageManager“; importuoti android.net.Uri; import android.provider.Nustatymai; importuoti „android.support.annotation.NonNull“; importuoti android.support.annotation.Nenable; importuoti java.io.Failas; viešosios klasės „BaseActivity“ išplečia „AppCompatActivity“ {public static final int WRITE_STORAGE = 100; viešas statinis finalas int SELECT_PHOTO = 102; viešoji statinė galutinė eilutė ACTION_BAR_TITLE = "action_bar_title"; vieša failo nuotrauka; @Apsaugoti negaliojantį „onCreate“ (@Nullable Bundle savedInstanceState) {super.onCreate (savedInstanceState); „ActionBar“ actionBar = getSupportActionBar (); if (actionBar! = null) {actionBar.setDisplayHomeAsUpEnabled (tiesa); „actionBar.setTitle“ („getIntent (). getStringExtra“ (ACTION_BAR_TITLE)); }} @Atšaukti viešą boolean „onCreateOptionsMenu“ (meniu meniu) {getMenuInflater (). Išpūsti (R.menu.my_menu, meniu); grįžti tiesa; } @Atšaukti viešą boolean „onOptionsItemSelected“ („MenuItem“ elementas) {switch (item.getItemId ()) {// Jei pasirinkta „gallery_action“, tada ... // atvejis R.id.gallery_action: //...tikrinti, ar mes turime WRITE_STORAGE leidimas // checkPermission (WRITE_STORAGE); pertrauka; } return super.onOptionsItemSelected (prekė); } @Atšaukti viešą negaliojimą onRequestPermissionsResult (int requestCode, @NonNull String leidimai, @NonNull int grantResults) {super.onRequestPermissionsResult (requestCode, permissions, grantResults); jungiklis (requestCode) {atvejis WRITE_STORAGE: // Jei leidimo užklausa suteikiama, tada ... // if (grantResults.length> 0 && grantResults == PackageManager.PERMISSION_GRANTED) {//...call selectPicture // selectPicture ( ); // Jei leidimo užklausa atmesta, tada ... //} dar {//...parodykite eilutę „luba_request“ // requestPermission (ši, requestCode, R.string.permission_request); } pertrauka; }} // Parodyti leidimo užklausos dialogą // public static void requestPermission (galutinė veiklos veikla, galutinė int requestCode, int msg) {AlertDialog.Builder alert = new AlertDialog.Builder (veikla); Alert.set (msg); alert.setPositiveButton („android.R.string.ok“, nauja „DialogInterface.OnClickListener“) () {@Paskelbti viešą tuštumą „OnClick“ („DialogInterface dialogInterface“, int i) {dialogInterface.dismiss (); „Intent permissonIntent“ = naujas ketinimas („Settings.ACTION_ETPLSS_; .setData („Uri.parse“ („paketas:“ + veikla.getPackageName ())); activity.startActivityForResult (permissonIntent, requestCode);}}); alert.setNegativeButton („android.R.string.cancel“, nauja „DialogInterface.OnClickListener“) () {@Paskelbti viešą tuštumą „onClick“ („DialogInterface dialogInterface“, int i) {dialogInterface.dismiss ();}}); alert.setCancelable (false); alert.show (); } // Patikrinkite, ar vartotojas suteikė WRITE_STORAGE leidimą // public void checkPermission (int requestCode) {switch (requestCode) {case WRITE_STORAGE: int hasWriteExternalStoragePermission = ActivityCompat.checkSelfPermission (this, Manifest.permission.WRITE_EXTERNAL_STORAGE); // Jei turime prieigą prie išorinės atminties ... // if (hasWriteExternalStoragePermission == PackageManager.PERMISSION_GRANTED) {//...call selectPicture, kuri pradeda veiklą, kurioje vartotojas gali pasirinkti vaizdą // selectPicture (); // Jei leidimas nebuvo suteiktas, tada ... //} dar {//...prašykite leidimo // ActivityCompat.requestPermissions (tai nauja eilutė {Manifest.permission.WRITE_EXTERNAL_STORAGE}, requestCode); } pertrauka; }} privati ​​tuštuma selectPicture () {photo = MyHelper.createTempFile (nuotrauka); Ketinimų ketinimas = naujas ketinimas (Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); // Pradėkite veiklą, kurioje vartotojas gali pasirinkti vaizdą // startActivityForResult (ketinimas, SELECT_PHOTO); }}

Šiuo metu jūsų projektas turėtų skųstis, kad jis negali išspręsti „MyHelper.createTempFile“. Įdiegkime tai dabar!

Vaizdų dydžio keitimas naudojant „createTempFile“

Sukurkite naują „MyHelper“ klasę. Šioje klasėje pakeisime pasirinkto vartotojo atvaizdo dydį, parengtą apdoroti Teksto atpažinimo API.

importuoti android.graphics.Bitmap; importuoti „android.graphics.BitmapFactory“; importuoti android.content.Context; importuoti „android.database.Cursor“; importuoti android.os.aplinka; importuoti „android.widget.ImageView“; importuoti „android.provider.MediaStore“; importuoti android.net.Uri; importuoti statinę „android.graphics.BitmapFactory.decodeFile“; importuoti statinę „android.graphics.BitmapFactory.decodeStream“; importuoti java.io.Failas; importuoti java.io.FileNotFoundException; importuoti java.io.FileOutputStream; import java.io.IOException; viešoji klasė „MyHelper“ {public static String getPath (kontekstinis kontekstas, Uri uri) {String path = ""; Styginių projekcija = {MediaStore.Images.Media.DATA}; Žymeklio žymeklis = context.getContentResolver (). Užklausa (uri, projekcija, null, null, null); int column_index; if (žymeklis! = nulis) {column_index = cursor.getColumnIndexOrThrow (MediaStore.Images.Media.DATA); cursor.moveToFirst (); kelias = cursor.getString (column_index); cursor.close (); } grįžimo kelias; } viešas statinis failas createTempFile (failo failas) {Failo katalogas = naujas failas (Environment.getExternalStorageDirectory (). getPath () + "/com.jessicathornsby.myapplication"); if (! katalogas.exists () ||! katalogas.isDirectory ()) {katalogas.mkdirs (); } if (failas == niekinis) {failas = naujas failas (katalogas, „orig.jpg“); } grąžinimo failas; } viešas statinis „Bitmap“ dydžio keitimasPhoto (failo „imageFile“, kontekstinis kontekstas, „Uri uri“, „ImageView“ vaizdas) {BitmapFactory.Options newOptions = new BitmapFactory.Options (); pabandykite {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“ (); grąžinti „compressPhoto“ (imageFile, BitmapFactory.decodeStream (context.getContentResolver (). openInputStream (uri), null, newOptions)); } pagauti (FileNotFoundException išimtis) {erand.printStackTrace (); grąžinti negaliojantį; }} viešas statinis „Bitmap“ dydžio keitimasPhoto (failo „imageFile“, eilutės kelias, „ImageView“ vaizdas) {BitmapFactory.Options options = new BitmapFactory.Options (); decodeFile (kelias, parinktys); int photoHeight = options.outHeight; int photoWidth = options.outWidth; options.inSampleSize = Math.min („photoWidth / view.getWidth“), „photoHeight“ / „view.getHeight“ (); grąžinti „compressPhoto“ („imageFile“, „BitmapFactory.decodeFile“ (kelias, parinktys)); } privatus statinis „Bitmap compressPhoto“ (failo „photoFile“, „bitmap bitmap“) {pabandykite {FileOutputStream fOutput = new FileOutputStream (photoFile); bitmap.compress (Bitmap.CompressFormat.JPEG, 70, fOutput); fOutput.close (); } pagauti (IOException išimtis) {erand.printStackTrace (); } grąžinti bitmap; }}

Nustatykite vaizdą į „ImageView“

Tada „MainActivity“ klasėje turime įdiegti „onActivityResult“ () ir nustatyti vartotojo pasirinktą paveikslėlį į „ImageView“.

importuoti android.graphics.Bitmap; importuoti android.os.Bundle; importuoti „android.widget.ImageView“; importuoti android.content.Intent; importuoti „android.widget.TextView“; importuoti android.net.Uri; viešosios klasės „MainActivity“ išplečia „BaseActivity“ {private bitmap myBitmap; privatus „ImageView“ „myImageView“; privatus „TextView“ „myTextView“; @Apsaugoti negaliojantį „onCreate“ (Bundle saveInstanceState) {super.onCreate (savedInstanceState); „setContentView“ (R.layout.activity_main); myTextView = findViewById (R.id.textView); myImageView = rastiViewById (R.id.imageView); } @Apsaugoti negaliojantys „onActivityResult“ (int requestCode, int rezultātsCode, ketinimų duomenys) {super.onActivityResult (requestCode, rezultātsCode, duomenys); if (resultCode == RESULT_OK) {perjungti (requestCode) {atvejis WRITE_STORAGE: checkPermission (requestCode); pertrauka; atvejis SELECT_PHOTO: „Uri dataUri = data.getData (); Styginių kelias = MyHelper.getPath (tai, dataUri); if (kelias == nulis) {myBitmap = MyHelper.resizePhoto (nuotrauka, ši, dataUri, myImageView); } else {myBitmap = MyHelper.resizePhoto (nuotrauka, kelias, „myImageView“); } if (myBitmap! = null) {myTextView.setText (null); „myImageView.setImageBitmap“ („myBitmap“); } pertrauka; }}}}

Vykdykite šį projektą fiziniame „Android“ įrenginyje arba AVD ir paspauskite veiksmų juostos piktogramą. Kai būsite paraginti, suteikite WRITE_STORAGE leidimą ir iš paveikslėlio pasirinkite paveikslėlį; šis vaizdas dabar turėtų būti rodomas jūsų programos vartotojo sąsajoje.

Dabar mes padėjome pagrindą ir esame pasirengę pradėti ištraukti tekstą!

Programos mokymas atpažinti tekstą

Noriu suaktyvinti teksto atpažinimą, reaguodamas į paspaudimo įvykį, todėl turime įdiegti „OnClickListener“:

importuoti android.graphics.Bitmap; importuoti android.os.Bundle; importuoti „android.widget.ImageView“; importuoti android.content.Intent; importuoti „android.widget.TextView“; importuoti android.view.View; importuoti android.net.Uri; viešosios klasės „MainActivity“ išplečia „BaseActivity“ diegimą „View.OnClickListener“ {privati ​​„Bitmap myBitmap“; privatus „ImageView“ „myImageView“; privatus „TextView“ „myTextView“; @Apsaugoti negaliojantį „onCreate“ (Bundle saveInstanceState) {super.onCreate (savedInstanceState); „setContentView“ (R.layout.activity_main); myTextView = findViewById (R.id.textView); myImageView = rastiViewById (R.id.imageView); „findViewById“ (R.id.checkText) .setOnClickListener (tai); } @Atšaukti viešą negaliojimą „onClick“ (rodinio vaizdas) {perjungti (view.getId ()) {atvejis R.id.checkText: if (myBitmap! = Null) {// Kitame veiksme įdiegsime „runTextRecog“ // runTextRecog (); } pertrauka; }}

„ML Kit“ gali apdoroti vaizdus tik tada, kai jie yra „FirebaseVisionImage“ formatu, todėl mes turime konvertuoti savo vaizdą į „FirebaseVisionImage“ objektą. Galite sukurti „FirebaseVisionImage“ iš „Bitmap“, „media.Image“, „ByteBuffer“ ar baitų masyvo. Kadangi mes dirbame su bitkoinais, turime paskambinti iš „FirebaseVisionImage“ klasės naudingumo metodo „fromBitmap ()“ ir perduoti jį mūsų „Bitmap“.

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

„ML Kit“ turi skirtingas detektorių klases kiekvienai savo vaizdo atpažinimo operacijai. Tekstui rašyti turime naudoti „FirebaseVisionTextDetector“ klasę, kuri atvaizdui suteikia optinį simbolių atpažinimą (OCR).

Mes sukuriame „FirebaseVisionTextDetector“ egzempliorių, naudodami „getVisionTextDetector“:

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

Tada mes turime patikrinti „FirebaseVisionImage“ tekstą, paskambinę metodui deteInImage () ir perduoti jį „FirebaseVisionImage“ objektu. Taip pat turime įdiegti „onSuccess“ ir „onFailure“ atšaukimus ir atitinkamus klausytojus, kad mūsų programa gautų pranešimą, kai tik bus pasiekiami rezultatai.

detector.detectInImage (vaizdas) .addOnSuccessListener (naujas „OnSuccessListener“)() {@Override // To do //}}). AddOnFailureListener (new OnFailureListener () {@Override public void onFailure (@NonNull Exception išimtis) {// Užduotis nepavyko su išimtimi //}}); }

Jei ši operacija nepavyks, aš parodysiu skrudinta duona, bet jei operacija bus sėkminga, aš sureaguosiu processExtractedText.

Šiuo metu mano teksto aptikimo kodas atrodo taip:

// Sukurkite „FirebaseVisionImage“ // private void runTextRecog () {FirebaseVisionImage image = FirebaseVisionImage.fromBitmap (myBitmap); // Sukurkite „FirebaseVisionCloudTextDetector“ egzempliorių // FirebaseVisionTextDetector detektorius = FirebaseVision.getInstance (). GetVisionTextDetector (); // Užregistruokite „OnSuccessListener“ // detector.detectInImage (vaizdas) .addOnSuccessListener (naujas „OnSuccessListener“)() {@Override // Įdiekite „onSuccess“ atšaukimą // „public void onSuccess“ („FirebaseVisionText“ tekstai) {// Skambinkite „processExtractedText“ su atsakymu // processExtractedText (tekstai); }}). „addOnFailureListener“ (naujas „OnFailureListener“) {@Override // Įdiekite „onFailure“ atkūrimą // „public void onFailure“ (@NonNull išimties išimtis) {Toast.makeText (MainActivity.this, „Exception", Toast.LENGTH_LONG). );}}); }

Kai tik mūsų programa gauna pranešimą apie sėkmę, turime analizuoti rezultatus.

Objektą „FirebaseVisionText“ gali sudaryti elementai, eilutės ir blokai, kur kiekvienas blokas paprastai prilygsta vienai teksto pastraipai. Jei „FirebaseVisionText“ grąžina 0 blokų, mes parodysime eilutę „no_text“, tačiau jei joje yra vienas ar keli blokai, gautą tekstą rodysime kaip savo „TextView“ dalį.

„private void processExtractedText“ („FirebaseVisionText firebaseVisionText“) {myTextView.setText (nulis); if (firebaseVisionText.getBlocks (). dydis () == 0) {myTextView.setText (R.string.no_text); grįžti; } skirtas („FirebaseVisionText.Block“ blokas: firebaseVisionText.getBlocks ()) {myTextView.append (block.getText ()); }}}

Štai baigtas „MainActivity“ kodas:

importuoti android.graphics.Bitmap; importuoti android.os.Bundle; importuoti „android.widget.ImageView“; importuoti android.content.Intent; importuoti „android.widget.TextView“; importuoti android.widget.Toast; importuoti android.view.View; importuoti android.net.Uri; importuoti „android.support.annotation.NonNull“; importuoti com.google.firebase.ml.vision.common.FirebaseVisionImage; importuoti com.google.firebase.ml.vision.text.FirebaseVisionText; importuoti com.google.firebase.ml.vision.text.FirebaseVisionTextDetector; importuoti com.google.firebase.ml.vision.FirebaseVision; importuoti com.google.android.gms.tasks.OnSuccessListener; importuoti com.google.android.gms.tasks.OnFailureListener; viešosios klasės „MainActivity“ išplečia „BaseActivity“ diegimą „View.OnClickListener“ {privati ​​„Bitmap myBitmap“; privatus „ImageView“ „myImageView“; privatus „TextView“ „myTextView“; @Apsaugoti negaliojantį „onCreate“ (Bundle saveInstanceState) {super.onCreate (savedInstanceState); „setContentView“ (R.layout.activity_main); myTextView = findViewById (R.id.textView); myImageView = rastiViewById (R.id.imageView); „findViewById“ (R.id.checkText) .setOnClickListener (tai); } @Atšaukti viešą negaliojimą „onClick“ (rodinio vaizdas) {perjungti (view.getId ()) {atvejis R.id.checkText: if (myBitmap! = Null) {runTextRecog (); } pertrauka; }} @Apsaugoti negaliojantį „onActivityResult“ (int requestCode, int rezultātsCode, ketinimų duomenys) {super.onActivityResult (requestCode, rezultato kodas, duomenys); if (resultCode == RESULT_OK) {perjungti (requestCode) {atvejis WRITE_STORAGE: checkPermission (requestCode); pertrauka; atvejis SELECT_PHOTO: „Uri dataUri = data.getData (); Styginių kelias = MyHelper.getPath (tai, dataUri); if (kelias == nulis) {myBitmap = MyHelper.resizePhoto (nuotrauka, ši, dataUri, myImageView); } else {myBitmap = MyHelper.resizePhoto (nuotrauka, kelias, „myImageView“); } if (myBitmap! = null) {myTextView.setText (null); „myImageView.setImageBitmap“ („myBitmap“); } pertrauka; }}} privati ​​negaliojanti runTextRecog () {FirebaseVisionImage image = FirebaseVisionImage.fromBitmap (myBitmap); „FirebaseVisionTextDetector detector“ = „FirebaseVision.getInstance (). GetVisionTextDetector (); detector.detectInImage (vaizdas) .addOnSuccessListener (naujas „OnSuccessListener“)() {@Atšaukti viešą negaliojimą dėl sėkmės („FirebaseVisionText“ tekstai) {processExtractedText (tekstai); })). „addOnFailureListener“ (naujas „OnFailureListener“) {@Paskelbti viešą negaliojimą dėl „OnFailure“ (@NonNull išimties išimtis) {„Toast.makeText“ („MainActivity.this“, „Exception“, Toast.LENGTH_LONG) .show ();}}); } „private void processExtractedText“ („FirebaseVisionText firebaseVisionText“) {myTextView.setText (nulis); if (firebaseVisionText.getBlocks (). dydis () == 0) {myTextView.setText (R.string.no_text); grįžti; } skirtas („FirebaseVisionText.Block“ blokas: firebaseVisionText.getBlocks ()) {myTextView.append (block.getText ()); }}}

Projekto išbandymas

Dabar laikas pamatyti, kaip veikia „ML Kit“ teksto atpažinimas! Įdiekite šį projektą „Android“ įrenginyje arba AVD, pasirinkite paveikslėlį iš galerijos ir bakstelėkite mygtuką „Tikrinti tekstą“. Programa turėtų atsakyti ištraukdama visą vaizdą iš teksto ir parodydama jį „TextView“.

Atminkite, kad, atsižvelgiant į jūsų vaizdo dydį ir jame esančio teksto kiekį, gali reikėti slinkti, kad pamatytumėte visą ištrauktą tekstą.

Taip pat galite atsisiųsti baigtą projektą iš „GitHub“.

Apvyniojimas

Dabar jūs žinote, kaip aptikti ir išgauti tekstą iš vaizdo naudojant „ML Kit“.

Teksto atpažinimo API yra tik viena „ML Kit“ dalis. Šis SDK taip pat siūlo brūkšninių kodų skenavimą, veido aptikimą, vaizdų žymėjimą ir orientyrų atpažinimą, planuojant pridėti daugiau API įprastiems mobiliojo ryšio atvejams, įskaitant „Smart Reply“ ir didelio tankio veido kontūrų API.

Kurią „ML Kit“ API jus labiausiai domina išbandyti? Praneškite mums toliau pateiktuose komentaruose!

Ketvirtadienį vykuiame pranešime žurnalitam Roba trayeri, Valtybė departamento ekretoriau pavaduotoja kibernetinė politiko klauimai, atkleidė, kad JAV vyriauybė greičiauiai neatnaujin laikino atiakymo...

Rugpjūčio pabaigoje„The Wall treet Journal“ pakelbė traipnį, kuriame pagrindini dėmey buvo kiriama Kinijo išmaniųjų telefonų gamintojo „Huawei“ įtariamiem patento pažeidimai. Šiandien bendrovė, atakyd...

Pasirinkite Administravimą