![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](https://a.23rdpta.org/apps/how-to-extract-text-from-images-with-googles-machine-learning-sdk-2.jpg)
Tartalom
- A készüléken vagy a felhőben?
- Szövegfelismerő alkalmazás létrehozása az ML Kit segítségével
- Töltse le a Google előre képzett gépi tanulási modelljeit
- Az elrendezés felépítése
- Műveleti sáv ikonok: A Galéria alkalmazás indítása
- Engedélykérelmek és kattintási események kezelése
- Képek átméretezése a createTempFile segítségével
- Állítsa a képet ImageView-ra
- Az alkalmazás tanítása a szöveg felismerésére
- A projekt tesztelése
- Csomagolás
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.
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:
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.
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 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 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 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. 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 projekt tesztelése
Csomagolás