Hogyan lehet szöveget kivonni a képekből a Google Machine Learning SDK segítségével

Szerző: John Stephens
A Teremtés Dátuma: 27 Január 2021
Frissítés Dátuma: 5 Július 2024
Anonim
Hogyan lehet szöveget kivonni a képekből a Google Machine Learning SDK segítségével - Alkalmazások
Hogyan lehet szöveget kivonni a képekből a Google Machine Learning SDK segítségével - Alkalmazások

Tartalom


Használhatja a Szövegfelismerés API-t is a fordítási alkalmazások vagy akadálymentesség-szolgáltatások alapjául, ahol a felhasználó a kamerájára mutathat minden olyan szöveget, amelyen küzdenek, és hangosan felolvassa őket.

Ebben az oktatóanyagban alapot teremtünk az innovatív szolgáltatások széles skálájához, létrehozva egy alkalmazást, amely kivonhatja a szöveget a felhasználói galéria bármely képéből. Annak ellenére, hogy nem foglalkozunk vele ebben az oktatóanyagban, valós időben rögzíthet szöveget a felhasználó környezetéből is, ha ezt az alkalmazást csatlakoztatja az eszköz kamerájához.

A készüléken vagy a felhőben?

Az ML Kit API-k egy része csak az eszközön érhető el, de néhány elérhető a készüléken és a felhőben is, beleértve a Szövegfelismerő API-t.


A felhőalapú szöveg API a nyelvek és karakterek szélesebb körét képes azonosítani, és nagyobb pontosságot ígér, mint az eszközön lévő megfelelő. Ennek ellenére csinál aktív internetkapcsolat szükséges, és csak a Blaze szintű projekteknél érhető el.

Ebben a cikkben helyben futtatjuk a Szövegfelismerés API-t, így követhetjük, függetlenül attól, hogy frissítettünk-e Blaze-re, vagy az ingyenes Firebase Spark tervre vonatkozunk-e.

Szövegfelismerő alkalmazás létrehozása az ML Kit segítségével

Hozzon létre egy alkalmazást a választott beállításokkal, de amikor a rendszer kéri, válassza az „Üres tevékenység” sablont.

Az ML Kit SDK a Firebase része, ezért a SHA-1 aláíró tanúsítvány használatával csatlakoztatnia kell a projektet a Firebase-hez. Ahhoz, hogy megkapja a projekt SHA-1-jét:


  • Válassza az Android Studio „Gradle” fület.
  • A „Gradle projektek” panelen kattintson duplán a projekt „gyökérjének” kibontására, majd válassza a „Feladatok> Android> Jelentés aláírása” lehetőséget.
  • Az Android Studio ablak alja mentén lévő panelen frissíteni kell néhány információt a projektről - ideértve a SHA-1 aláíró tanúsítványát is.

A projekt csatlakoztatása a Firebase-hez:

  • Indítson el böngészőjében a Firebase konzolt.
  • Válassza az „Projekt hozzáadása” lehetőséget.
  • Adjon nevet a projektnek; Az „ML Test” -t használom.
  • Olvassa el a felhasználási feltételeket, és ha szívesen folytatja, válassza az „Elfogadom…”, majd a „Projekt létrehozása” lehetőséget.
  • Válassza az „Firebase hozzáadása az Android-alkalmazáshoz” lehetőséget.
  • Írja be a projekt csomagnevét, amelyet a MainActivity fájl tetején és a Manifestben talál.
  • Írja be a projekt SHA-1 aláíró tanúsítványát.
  • Kattintson az „Alkalmazás regisztrálása” elemre.
  • Válassza a „Letöltés google-services.json” lehetőséget. Ez a fájl tartalmazza a projekt összes szükséges Firebase metaadatát, beleértve az API-kulcsot.
  • Az Android Stúdióban húzza a google-services.json fájlt a projekt „app” könyvtárába.

  • Nyissa meg a projekt szintű build.gradle fájlt, és adja hozzá a Google szolgáltatások osztályútját:

classpath com.google.gms: google-szolgáltatások: 4.0.1

  • Nyissa meg az alkalmazás szintű build.gradle fájlt, és adjon hozzá függőségeket a Firebase Core, a Firebase ML Vision és a modelltolmácshoz, valamint a Google szolgáltatások beépülő moduljához:

plugin alkalmazása: com.google.gms.google-services ... ... ... függőségek {implementációs fájlTree (dir: libs, tartalmazza:) implementáció com.google.firebase: firebase-core: 16.0.1 implementációs com. google.firebase: firebase-ml-vision: 16.0.0 megvalósítás com.google.firebase: firebase-ml-model-interpreter: 16.0.0

Ezen a ponton el kell futtatnia a projektet, hogy csatlakozhasson a Firebase szerverekhez:

  • Telepítse alkalmazását fizikai Android okostelefonra vagy táblagépre, vagy Android virtuális eszközre (AVD).
  • A Firebase konzolban válassza az „Indítsa el az alkalmazást a telepítés ellenőrzéséhez” lehetőséget.
  • Néhány pillanat múlva megjelenik egy „Gratulálunk” felirat; válassza a „Tovább a konzolra” lehetőséget.

Töltse le a Google előre képzett gépi tanulási modelljeit

Alapértelmezés szerint az ML Kit csak akkor tölti le a modelleket, amikor szükség van rájuk, tehát alkalmazásunk tölti le az OCR modellt, amikor a felhasználó első alkalommal próbál kibontani a szöveget.

Ez potenciálisan negatív hatással lehet a felhasználói élményre - képzelje el, hogy megpróbál hozzáférni egy funkcióhoz, csak hogy felfedezze, hogy az alkalmazásnak több erőforrást kell letöltenie, mielőtt ténylegesen elérhetővé tenné ezt a funkciót. A legrosszabb esetben az alkalmazás valószínűleg nem is képes letölteni a szükséges erőforrásokat, amikor szüksége van rájuk, például ha az eszköznek nincs internet-kapcsolata.

Annak biztosítása érdekében, hogy ez ne történjen meg alkalmazásunkkal, telepítéskor letölti a szükséges OCR-modellt, amely a Maniesthez bizonyos változtatásokat igényel.

Amíg a Manifest nyitva van, hozzáteszem a WRITE_EXTERNAL_STORAGE engedélyt is, amelyet később felhasználunk ebben az oktatóanyagban.

// Adja hozzá a WRITE_EXTERNAL_STORAGE engedélyt // // Adja hozzá a következőt //

Az elrendezés felépítése

Készítsük el az egyszerű dolgokat az útból, és készítsünk elrendezést, amely a következőkből áll:

  • ImageView. Kezdetben ez megjeleníti a helyőrzőt, de akkor frissül, amikor a felhasználó kiválaszt egy képet a galériájából.
  • Gomb, amely elindítja a szöveg kibontását.
  • TextView, ahol megjelenítjük a kibontott szöveget.
  • A ScrollView. Mivel nincs garancia arra, hogy a kibontott szöveg jól illeszkedik a képernyőn, a TextView-t egy ScrollView-be fogom helyezni.

Itt van a kész activity_main.xml fájl:

Ez az elrendezés egy „ic_placeholder” rajzra hivatkozik, tehát hozzuk létre ezt most:

  • Az Android Studio eszköztáron válassza a „Fájl> Új> Képkészlet” lehetőséget.
  • Nyissa meg az „Ikontípus” legördülő menüt és válassza a „Műveleti sáv és fülikonok” lehetőséget.
  • Ellenőrizze, hogy a „Clip Art” választógomb van-e kiválasztva.
  • Kattintson egy kattintással a „Clip Art” gombra.
  • Válassza ki a helyőrzőként használni kívánt képet; A „Hozzáadás a fotókhoz” lehetőséget használom.
  • Kattintson az „OK” gombra.
  • Nyissa meg a „Téma” legördülő menüt, és válassza a „HOLO_LIGHT” lehetőséget.
  • A „Név” mezőbe írja be az „ic_placeholder” címet.
  • Kattintson a „Következő” gombra. Olvassa el az információt, és ha szívesen folytatja, kattintson a „Befejezés” gombra.

Műveleti sáv ikonok: A Galéria alkalmazás indítása

Ezután el fogok készíteni egy akciósáv elemet, amely elindítja a felhasználó galériáját, készen áll a kép kiválasztására.

A műveleti sor ikonjait meghatározhatja egy menü erőforrás-fájlban, amely az „res / menu” könyvtárban található. Ha a projekt nem tartalmazza ezt a könyvtárat, akkor létre kell hoznia azt:

  • Kattintson a vezérlőgombra a projekt „res” könyvtárába, és válassza az “Új> Android erőforrás könyvtár” lehetőséget.
  • Nyissa meg az „Erőforrás típusa” legördülő menüt és válassza a „menü” lehetőséget.
  • A „Címtárnév” automatikusan frissül a „menü” -re, de ha nem, akkor manuálisan kell átneveznie.
  • Kattintson az „OK” gombra.

Most már készen áll a menüforrás-fájl létrehozására:

  • Kattintson a vezérlőgombra a projekt „menü” könyvtárába, és válassza az „Új> Menü erőforrás fájl” lehetőséget.
  • Nevezze ezt a fájlt „my_menu” -nak.
  • Kattintson az „OK” gombra.
  • Nyissa meg a „my_menu.xml” fájlt, és adja hozzá a következőket:

// Hozzon létre egy elem minden művelethez //

A menüfájl egy „action_gallery” karakterláncra hivatkozik, tehát nyissa meg a projekt res / érték / strings.xml fájlját, és hozza létre ezt az erőforrást. Miközben itt vagyok, meghatározzam azokat a többi húrokat is, amelyeket a projekt során használunk.

Képtár Ennek az alkalmazásnak hozzáférnie kell a készüléken található fájlokhoz. Nem található szöveg

Ezután az Image Asset Studio segítségével hozhatja létre az akciósáv „ic_gallery” ikonját:

  • Válassza a „Fájl> Új> Képkészlet” lehetőséget.
  • Állítsa az „Ikontípus” legördülő menüt „Műveleti sáv és lapikonok” elemre.
  • Kattintson a „Clip Art” gombra.
  • Válasszon egy rajzot; A „képet” használom.
  • Kattintson az „OK” gombra.
  • Annak érdekében, hogy ez az ikon jól látható legyen a műveletsávon, nyissa meg a „Téma” legördülő menüt és válassza a „HOLO_DARK” lehetőséget.
  • Nevezze ezt az ikont „ic_gallery” -nek.
  • „Kattintson a„ Következő ”, majd a„ Befejezés ”gombra.

Engedélykérelmek és kattintási események kezelése

Az összes olyan feladatot, amely nem közvetlenül kapcsolódik a Szövegfelismerés API-hoz, külön BaseActivity osztályban hajtom végre, ideértve a menü újraindítását, a műveleti sávra kattintási események kezelését és az eszköz tárolójához való hozzáférés kérését.

  • Az Android Studio eszköztárán válassza a „Fájl> Új> Java osztály” lehetőséget.
  • Nevezze ezt az osztályt „BaseActivity” -nek.
  • Kattintson az „OK” gombra.
  • Nyissa meg a BaseActivityt, és adja hozzá a következőket:

import android.app.Activity; import android.support.v4.app.ActivityCompat; import android.support.v7.app.ActionBar; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.content.DialogInterface; import android.content.Intent; import android.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.Settings; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import java.io.File; a nyilvános osztály BaseActivity kiterjeszti az AppCompatActivity {nyilvános statikus végleges int WRITE_STORAGE = 100; nyilvános statikus végleges int SELECT_PHOTO = 102; nyilvános statikus végleges karakterlánc ACTION_BAR_TITLE = "action_bar_title"; nyilvános fájlfájl; @A felülírva védett érvénytelen onCreate (@Nullable Bundle savedInstanceState) {super.onCreate (savedInstanceState); ActionBar actionBar = getSupportActionBar (); if (actionBar! = null) {actionBar.setDisplayHomeAsUpEnabled (igaz); actionBar.setTitle (getIntent (). getStringExtra (ACTION_BAR_TITLE)); }} @A nyilvános logikai onCreateOptionsMenu (menümenü) felülírása (menü menü) {getMenuInflater (). Felfújása (R.menu.my_menu, menü); visszatér igaz; } @Ortion nyilvános logikai onOptionsItemSelected (MenuItem elem) {switch (item.getItemId ()) {// Ha a „gallery_action” van kiválasztva, akkor ... // eset R.id.gallery_action: //...check van a WRITE_STORAGE engedély // checkPermission (WRITE_STORAGE); szünet; } visszatérés super.onOptionsItemSelected (tétel); } @A nyilvános érvénytelen onRequestPermissionsResult felülírása (int requestCode, @NonNull String engedélyek, @NonNull int grantResults) {super.onRequestPermissionsResult (requestCode, engedélyek, grantResults); kapcsoló (requestCode) {eset WRITE_STORAGE: // Ha az engedélykérelmet megadták, akkor ... // if (grantResults.length> 0 && grantResults == PackageManager.PERMISSION_GRANTED) {//...hívás selectPicture // selectPicture ( ); // Ha az engedélykérelmet elutasítják, akkor ... //} egyébként {//...megjeleníti az „luba_request” karakterláncot // requestPermission (ez, requestCode, R.string.permission_request); } szünet; }} // Jelenítse meg az engedélykérelmi párbeszédpanelt // public statical void requestPermission (végleges tevékenység, végleges int requestCode, int msg) {AlertDialog.Builder figyelmeztetés = new AlertDialog.Builder (tevékenység); alert.set (msg); Alert.setPositiveButton (android.R.string.ok, új DialogInterface.OnClickListener () {@Oreride public void onClick (DialogInterface dialogInterface, int i) {dialogInterface.dismiss (); Intent permissonIntent = new Intent (Settings.ACTION_APPLICATION_DL .setData (Uri.parse ("csomag:" + tevékenység.getPackageName ()); activity.startActivityForResult (permissonIntent, requestCode);}}); Alert.setNegativeButton (android.R.string.cancel, új DialogInterface.OnClickListener () {@A nyilvános érvénytelenség onClick felülírása (DialogInterface dialogInterface, int i) {dialogInterface.dismiss ();}}); alert.setCancelable (false); alert.show (); } // Ellenőrizze, hogy a felhasználó megadta-e a WRITE_STORAGE engedélyt // public void checkPermission (int requestCode) {kapcsoló (requestCode) {eset WRITE_STORAGE: int hasWriteExternalStoragePermission = ActivityCompat.checkSelfPermission (ez, Manifest.permission.WRITE_EXTERNAL_STORAGE); // Ha hozzáférünk a külső tárolóhoz ... // if (hasWriteExternalStoragePermission == PackageManager.PERMISSION_GRANTED) {//...hívás SelectPicture, amely elindít egy tevékenységet, ahol a felhasználó kiválaszthat képet // selectPicture (); // Ha az engedélyt nem adták meg, akkor ... //} egyébként {//...kérem az engedélyt // ActivityCompat.requestPermissions (ez az új karakterlánc {Manifest.permission.WRITE_EXTERNAL_STORAGE}, requestCode); } szünet; }} privát érvénytelen selectPicture () {photo = MyHelper.createTempFile (fotó); Szándék szándéka = új szándék (Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); // Olyan tevékenység indítása, amelyben a felhasználó választhat egy képet // startActivityForResult (szándék, SELECT_PHOTO); }}

Ezen a ponton a projektjének panaszosnak kell lennie, hogy nem tudja megoldani a MyHelper.createTempFile fájlt. Végezzük el ezt most!

Képek átméretezése a createTempFile segítségével

Hozzon létre egy új „MyHelper” osztályt. Ebben az osztályban átméretezzük a felhasználó által választott képet, amely készen áll a feldolgozásra a Szövegfelismerő API-n.

import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.content.Context; import android.database.Cursor; import android.os.Környezet; import android.widget.ImageView; import android.provider.MediaStore; import android.net.Uri; statikus android.graphics importálása.BitmapFactory.decodeFile; statikus android.graphics importálása.BitmapFactory.decodeStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; MyHelper nyilvános osztály {nyilvános statikus karakterlánc getPath (kontextus kontextus, Uri uri) {String path = ""; Karakterlánc-vetítés = {MediaStore.Images.Media.DATA}; Kurzor kurzor = context.getContentResolver (). Query (uri, vetítés, null, null, null); int oszlop_index; if (kurzor! = null) {column_index = cursor.getColumnIndexOrThrow (MediaStore.Images.Media.DATA); cursor.moveToFirst (); elérési út = kurzor.getString (oszlop_index); cursor.close (); } visszatérési útvonal; } nyilvános statikus fájl createTempFile (fájl fájl) {Fájl könyvtár = új fájl (Environment.getExternalStorageDirectory (). getPath () + "/com.jessicathornsby.myapplication"); if (! Directory.exists () ||! Directory.isDirectory ()) {Directory.mkdirs (); } if (fájl == null) {fájl = új fájl (könyvtár, "orig.jpg"); } visszatérési fájl; } nyilvános statikus Bitmap resizePhoto (File imageFile, Context kontekst, Uri uri, ImageView nézet) {BitmapFactory.Options newOptions = new BitmapFactory.Options (); próbálja ki a {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 ()); visszatérés a compressPhoto-hoz (imageFile, BitmapFactory.decodeStream (context.getContentResolver (). openInputStream (uri), null, newOptions)); } fogás (FileNotFoundException kivétel) {Kivétel.printStackTrace (); visszatérés null; }} nyilvános statikus Bitmap resizePhoto (File imageFile, String path, ImageView nézet) {BitmapFactory.Options options = new BitmapFactory.Options (); decodeFile (elérési út, opciók); int photoHeight = options.outHeight; int photoWidth = options.outWidth; options.inSampleSize = Math.min (photoWidth / view.getWidth (), photoHeight / view.getHeight ()); return compressPhoto (imageFile, BitmapFactory.decodeFile (elérési út, opciók)); } privát statikus Bitmap compressPhoto (fájlfájl, bittérképes bitkép) {próbálja meg {FileOutputStream fOutput = új FileOutputStream (photoFile); bitmap.compress (Bitmap.CompressFormat.JPEG, 70, fOutput); fOutput.close (); } fogás (IOException kivétel) {Kivétel.printStackTrace (); } visszatérő bitkép; }}

Állítsa a képet ImageView-ra

Ezután be kell építenünk az onActivityResult () -ta MainActivity osztályunkba, és a felhasználó által választott képet az ImageView-ra kell állítanunk.

import android.graphics.Bitmap; import android.os.Bundle; import android.widget.ImageView; import android.content.Intent; import android.widget.TextView; import android.net.Uri; a nyilvános osztályú MainActivity kiterjeszti az BaseActivity {private bitmap myBitmap; privát ImageView myImageView; privát TextView myTextView; @ Felülírja a védett érvénytelen onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); myTextView = findViewById (R.id.textView); myImageView = findViewById (R.id.imageView); } @A felülírott védett érvénytelenség onActivityResult (int requestCode, int resultCode, Intent data) {super.onActivityResult (requestCode, resultCode, data); if (resultCode == RESULT_OK) {kapcsoló (requestCode) {eset WRITE_STORAGE: checkPermission (requestCode); szünet; SELECT_PHOTO eset: Uri dataUri = data.getData (); Húros út = MyHelper.getPath (ez, dataUri); if (elérési út == null) {myBitmap = MyHelper.resizePhoto (fénykép, ez, dataUri, myImageView); } else {myBitmap = MyHelper.resizePhoto (fénykép, útvonal, myImageView); } if (myBitmap! = null) {myTextView.setText (null); myImageView.setImageBitmap (myBitmap); } szünet; }}}}

Futtassa ezt a projektet egy fizikai Android-eszközön vagy AVD-n, és kattintson a cselekvési sor ikonjára. Amikor a rendszer kéri, adja meg a WRITE_STORAGE engedélyt, és válassza ki a képet a galériából; ezt a képet most meg kell jeleníteni az alkalmazás felhasználói felületén.

Most megtettük az alapjait, készen állunk a szöveg kibontására!

Az alkalmazás tanítása a szöveg felismerésére

A kattintási eseményre válaszul el akarom indítani a szövegfelismerést, ezért be kell építenünk egy OnClickListener alkalmazást:

import android.graphics.Bitmap; import android.os.Bundle; import android.widget.ImageView; import android.content.Intent; import android.widget.TextView; import android.view.View; import android.net.Uri; A nyilvános osztályú MainActivity kibővíti a BaseActivity eszközt a View.OnClickListener {private bitmap myBitmap; privát ImageView myImageView; privát TextView myTextView; @ Felülírja a védett érvénytelen 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 (e); } @A nyilvános érvénytelenség onClick felülnézete (Nézet nézet) {kapcsoló (view.getId ()) {eset R.id.checkText: if (myBitmap! = Null) {// A runTextRecog programot a következő lépésben valósítjuk meg // runTextRecog (); } szünet; }}

Az ML Kit csak akkor képes feldolgozni a képeket, ha FirebaseVisionImage formátumban vannak, tehát a képeinket FirebaseVisionImage objektummá kell konvertálnunk. Készíthet FirebaseVisionImage egy Bitmap, media.Image, ByteBuffer vagy bájt tömbből. Mivel bitmapokkal dolgozunk, fel kell hívnunk a FirebaseVisionImage osztály fromBitmap () segédprogram módszerét, és át kell adnunk azt Bitmapünknek.

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

Az ML Kit különféle detektorosztályokkal rendelkezik minden képfelismerési művelethez. Szövegként a FirebaseVisionTextDetector osztályt kell használnunk, amely egy képen optikai karakterfelismerést (OCR) hajt végre.

Hozzunk létre egy FirebaseVisionTextDetector példányt a getVisionTextDetector használatával:

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

Ezután ellenőriznünk kell a FirebaseVisionImage szöveget, meghívva az deteInImage () metódust, és átadni a FirebaseVisionImage objektumnak. Be kell valósítanunk az onSuccess és onFailure visszahívásokat, valamint a megfelelő hallgatókat is, így alkalmazásunk értesítést kap, amikor az eredmények elérhetővé válnak.

detector.detectInImage (kép) .addOnSuccessListener (új OnSuccessListener() {@Override // Teendő //}}). AddOnFailureListener (új OnFailureListener () {@Orderide public void onFailure (@NonNull kivétel kivétel) {// A feladat kivételével sikertelen //}}); }

Ha ez a művelet kudarcot vall, akkor egy pirítósot fogok megjeleníteni, de ha a művelet sikeres, akkor a processExtractedText-et felhívom a választ.

Ezen a ponton a szövegérzékelő kódom így néz ki:

// FirebaseVisionImage létrehozása // private void runTextRecog () {FirebaseVisionImage image = FirebaseVisionImage.fromBitmap (myBitmap); // Készítsen FirebaseVisionCloudTextDetector példányt // FirebaseVisionTextDetector detektor = FirebaseVision.getInstance (). GetVisionTextDetector (); // OnSuccessListener regisztrálása // detector.detectInImage (kép) .addOnSuccessListener (új OnSuccessListener() {@Override // Végezzük el az onSuccess visszahívását // public void onSuccess (FirebaseVisionText szövegek) {// Hívja a processExtractedText-t válaszával // processExtractedText (szövegek); }OnFailureListener (új OnFailureListener () {@Override // Az onFailure calback végrehajtása // nyilvános void onFailure (@NonNull kivétel kivétel)) {Toast.makeText (MainActivity.this, "Exception", Toast.LENGTH_LONG) .show ( );}}); }

Amikor alkalmazásunk kap egy onSuccess értesítést, elemeznünk kell az eredményeket.

A FirebaseVisionText objektum elemeket, vonalakat és blokkokat tartalmazhat, ahol minden blokk általában egyenlő a szöveg egyetlen bekezdésével. Ha a FirebaseVisionText 0 blokkot ad vissza, akkor megjelenik a „no_text” karakterlánc, de ha egy vagy több blokkot tartalmaz, akkor a visszakeresett szöveget a TextView részeként jelenítjük meg.

magán érvénytelen folyamatExtractedText (FirebaseVisionText firebaseVisionText) {myTextView.setText (null); if (firebaseVisionText.getBlocks (). size () == 0) {myTextView.setText (R.string.no_text); Visszatérés; } a (FirebaseVisionText.Block blokkhoz: firebaseVisionText.getBlocks ()) {myTextView.append (block.getText ()); }}}

Itt van a kitöltött MainActivity kód:

import android.graphics.Bitmap; import android.os.Bundle; import android.widget.ImageView; import android.content.Intent; import android.widget.TextView; import android.widget.Toast; import android.view.View; import android.net.Uri; import android.support.annotation.NonNull; import com.google.firebase.ml.vision.common.FirebaseVisionImage; import com.google.firebase.ml.vision.text.FirebaseVisionText; import com.google.firebase.ml.vision.text.FirebaseVisionTextDetector; import com.google.firebase.ml.vision.FirebaseVision; import com.google.android.gms.tasks.OnSuccessListener; import com.google.android.gms.tasks.OnFailureListener; A nyilvános osztályú MainActivity kibővíti a BaseActivity eszközt a View.OnClickListener {private bitmap myBitmap; privát ImageView myImageView; privát TextView myTextView; @ Felülírja a védett érvénytelen 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 (e); } @A nyilvános érvénytelenség onClick (nézet nézet) felülírása {kapcsoló (view.getId ()) {eset R.id.checkText: if (myBitmap! = Null) {runTextRecog (); } szünet; }} @Override védett érvénytelen onActivityResult (int requestCode, int resultCode, Intent data) {super.onActivityResult (requestCode, resultCode, data); if (resultCode == RESULT_OK) {kapcsoló (requestCode) {eset WRITE_STORAGE: checkPermission (requestCode); szünet; SELECT_PHOTO eset: Uri dataUri = data.getData (); Húros út = MyHelper.getPath (ez, dataUri); if (elérési út == null) {myBitmap = MyHelper.resizePhoto (fénykép, ez, dataUri, myImageView); } else {myBitmap = MyHelper.resizePhoto (fénykép, útvonal, myImageView); } if (myBitmap! = null) {myTextView.setText (null); myImageView.setImageBitmap (myBitmap); } szünet; }}} privát érvénytelen runTextRecog () {FirebaseVisionImage image = FirebaseVisionImage.fromBitmap (myBitmap); FirebaseVisionTextDetector detektor = FirebaseVision.getInstance (). GetVisionTextDetector (); detector.detectInImage (kép) .addOnSuccessListener (új OnSuccessListener() {@A nyilvános érvénytelen onSuccess felülírása (FirebaseVisionText szövegek) {processExtractedText (szövegek); addOnFailureListener (új OnFailureListener () {@Oreride public void onFailure (@NonNull kivétel kivétel)) {Toast.makeText (MainActivity.this, "Exception", Toast.LENGTH_LONG) .show ();}}); } magán érvénytelen folyamatExtractedText (FirebaseVisionText firebaseVisionText) {myTextView.setText (null); if (firebaseVisionText.getBlocks (). size () == 0) {myTextView.setText (R.string.no_text); Visszatérés; } a (FirebaseVisionText.Block blokkhoz: firebaseVisionText.getBlocks ()) {myTextView.append (block.getText ()); }}}

A projekt tesztelése

Itt az ideje, hogy az ML Kit Szövegfelismerése működjön! Telepítse ezt a projektet Android-eszközre vagy AVD-re, válasszon egy képet a galériából, majd érintse meg a „Szöveg ellenőrzése” gombot. Az alkalmazásnak úgy kell válaszolnia, hogy kivonja az összes szöveget a képről, majd megjeleníti azt egy TextView-ban.

Vegye figyelembe, hogy a kép méretétől és a benne szereplő szöveg mennyiségétől függően előfordulhat, hogy gördítést igényel az összes kibontott szöveg megtekintéséhez.

A befejezett projektet a GitHubból is letöltheti.

Csomagolás

Most már tudja, hogyan lehet felismerni és kivonni egy képet egy képről az ML Kit segítségével.

A Szövegfelismerő API csak az ML Kit része. Ez az SDK vonalkód-letapogatást, arcfelismerést, képcímkézést és mérföldkő felismerést kínál, és további API-kat kíván hozzáadni a szokásos mobilhasználati esetekhez, ideértve a Smart Reply és a nagy sűrűségű arckontúr API-kat.

Melyik ML Kit API-t kipróbálja a leginkább? Tudassa velünk az alábbi megjegyzésekben!

A Motorola One Viion a vállalat egyik legfontoabb kiadáa az évben, 2019-ben rengeteg dobozt megjelölve egy költégvetéi ezköz zámára. Mot a márka ...

A hétvégén egy máik helyen állítottam fel a Google Home Mini kézüléket, é zámo kérdét feltettem vele az út orán....

Lenyűgöző Hozzászólások