Jak extrahovat text z obrázků pomocí Google Machine Learning SDK

Autor: John Stephens
Datum Vytvoření: 27 Leden 2021
Datum Aktualizace: 5 Červenec 2024
Anonim
Jak extrahovat text z obrázků pomocí Google Machine Learning SDK - Aplikace
Jak extrahovat text z obrázků pomocí Google Machine Learning SDK - Aplikace

Obsah


Rozhraní API pro rozpoznávání textu můžete použít také jako základ pro překladové aplikace nebo služby usnadnění přístupu, kde uživatel může zaměřit svou kameru na jakýkoli text, s nímž se potýkají, a nechat si ji nahlas přečíst.

V tomto tutoriálu položíme základy široké škály inovativních funkcí vytvořením aplikace, která dokáže extrahovat text z libovolného obrázku v galerii uživatele. Přestože v tomto tutoriálu to nebudeme pokrývat, můžete také zachytit text z okolí uživatele v reálném čase, připojením této aplikace k fotoaparátu zařízení.

Na zařízení nebo v cloudu?

Některá rozhraní API API jsou dostupná pouze na zařízení, ale několik je k dispozici na zařízení i v cloudu, včetně rozhraní API pro rozpoznávání textu.


Cloudové textové rozhraní API dokáže identifikovat širší škálu jazyků a znaků a slibuje větší přesnost než jeho protějšek v zařízení. Nicméně, to ano vyžadují aktivní připojení k internetu a je k dispozici pouze pro projekty na úrovni Blaze.

V tomto článku spustíme rozhraní API pro rozpoznávání textu místně, takže můžete sledovat, bez ohledu na to, zda jste upgradovali na Blaze, nebo jste na bezplatném plánu Firebase Spark.

Vytvoření aplikace pro rozpoznávání textu pomocí sady ML Kit

Vytvořte aplikaci s vybraným nastavením, ale na výzvu vyberte šablonu „Prázdná aktivita“.

Sada ML Kit SDK je součástí Firebase, takže budete muset svůj projekt připojit k Firebase pomocí podpisového certifikátu SHA-1. Získání SHA-1 vašeho projektu:


  • Vyberte kartu „Gradle“ aplikace Android Studio.
  • Na panelu Přepracovat projekty poklepáním rozbalte „root“ projektu a poté vyberte „Úkoly> Android> Zpráva o podpisu“.
  • Panel v dolní části okna Android Studio by se měl aktualizovat, aby zobrazoval některé informace o tomto projektu - včetně podpisového certifikátu SHA-1.

Postup připojení projektu k Firebase:

  • Ve webovém prohlížeči spusťte konzolu Firebase.
  • Vyberte „Přidat projekt“.
  • Pojmenujte svůj projekt; Používám „ML Test“.
  • Přečtěte si smluvní podmínky a pokud budete rádi pokračovat, vyberte možnost „Přijímám ...“ a poté „Vytvořit projekt“.
  • Vyberte možnost „Přidat Firebase do aplikace pro Android“.
  • Zadejte název balíčku projektu, který najdete v horní části souboru MainActivity a uvnitř manifestu.
  • Zadejte podpisový certifikát SHA-1 svého projektu.
  • Klikněte na „Zaregistrovat aplikaci“.
  • Vyberte „Stáhnout google-services.json.“ Tento soubor obsahuje všechna nezbytná metadata Firebase pro váš projekt, včetně klíče API.
  • V Android Studio přetáhněte soubor google-services.json do adresáře „app“ vašeho projektu.

  • Otevřete soubor build.gradle na úrovni projektu a přidejte třídu cesty služeb Google:

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

  • Otevřete soubor build.gradle na úrovni aplikace a přidejte závislosti pro Firebase Core, Firebase ML Vision a interpret modelu, plus plugin služeb Google:

apply plugin: com.google.gms.google-services ... ... ... závislosti {implementační souborTree (adresář: libs, include:) implementace com.google.firebase: firebase-core: 16.0.1 implementace com. google.firebase: firebase-ml-vision: implementace 16.0.0 com.google.firebase: firebase-ml-model-interpret: 16.0.0

Nyní musíte svůj projekt spustit, aby se mohl připojit k serverům Firebase:

  • Nainstalujte si aplikaci na fyzický smartphone nebo tablet Android nebo na virtuální zařízení Android (AVD).
  • V konzole Firebase vyberte „Spustit aplikaci pro ověření instalace“.
  • Po několika okamžicích byste měli vidět „Gratulujeme“; vyberte „Pokračovat do konzole“.

Stáhněte si předem připravené modely strojového učení společnosti Google

Ve výchozím nastavení ML Kit stahuje pouze modely, kdykoli je to potřeba, takže naše aplikace stáhne model OCR, když se uživatel pokusí extrahovat text poprvé.

To by mohlo mít nepříznivý dopad na uživatelský dojem - představte si, že se pokusíte o přístup k určité funkci, pouze abyste zjistili, že aplikace musí stáhnout více zdrojů, než může tuto funkci skutečně dodat. V nejhorším případě nemusí být aplikace schopna stáhnout zdroje, které potřebuje, pokud je potřebuje, například pokud zařízení nemá připojení k internetu.

Abychom se ujistili, že se to u naší aplikace neděje, stáhnu si potřebný model OCR v době instalace, což vyžaduje některé změny u Maniestu.

I když máme Manifest otevřený, přidám také oprávnění WRITE_EXTERNAL_STORAGE, které budeme používat později v tomto tutoriálu.

// Přidejte oprávnění WRITE_EXTERNAL_STORAGE // // Přidejte následující //

Budování rozložení

Vyjdeme z cesty jednoduché věci a vytvoříme rozvržení sestávající z:

  • ImageView. Zpočátku se zobrazí zástupný symbol, ale aktualizuje se, jakmile uživatel vybere obrázek ze své galerie.
  • Tlačítko, které spustí extrakci textu.
  • TextView, kde zobrazíme extrahovaný text.
  • ScrollView. Protože neexistuje žádná záruka, že se extrahovaný text bude na obrazovce úhledně hodit, umístím TextView uvnitř ScrollView.

Zde je hotový soubor activity_main.xml:

Toto rozložení odkazuje na „ic_placeholder“ drawable, takže vytvořme to nyní:

  • Na panelu nástrojů pro Android Studio vyberte „File> New> Image Asset“.
  • Otevřete rozbalovací nabídku „Typ ikon“ a vyberte „Ikony lišty akcí a karet“.
  • Ujistěte se, že je vybrán přepínač „Clip Art“.
  • Klikněte na tlačítko „Clip Art“.
  • Vyberte obrázek, který chcete použít jako svůj zástupný symbol; Používám „Přidat k fotografiím“.
  • Klikněte na „OK“.
  • Otevřete rozbalovací nabídku Téma a vyberte možnost HOLO_LIGHT.
  • Do pole Název zadejte „ic_placeholder“.
  • Klikněte na „Další“. Přečtěte si informace a pokud budete rádi pokračovat, klikněte na „Dokončit“.

Ikony na panelu akcí: Spuštění aplikace Galerie

Dále vytvořím položku panelu akcí, která spustí galerii uživatele a je připravena vybrat obrázek.

Ikony panelu akcí definujete uvnitř souboru prostředků nabídky, který žije v adresáři „res / menu“. Pokud váš projekt tento adresář neobsahuje, musíte jej vytvořit:

  • Control-klikněte na adresář „res“ vašeho projektu a vyberte „Nový> Android Resource Directory“.
  • Otevřete rozbalovací nabídku „Typ zdroje“ a vyberte „nabídku“.
  • Název adresáře by se měl automaticky aktualizovat na „nabídku“, ale pokud tomu tak není, budete jej muset přejmenovat ručně.
  • Klikněte na „OK“.

Nyní jste připraveni vytvořit soubor prostředků nabídky:

  • Control-klikněte na adresář „nabídky“ vašeho projektu a vyberte „Nový> Zdrojový soubor nabídky“.
  • Pojmenujte tento soubor „my_menu.“
  • Klikněte na „OK“.
  • Otevřete soubor „my_menu.xml“ a přidejte následující:

// Vytvořte prvek pro každou akci //

Soubor nabídky odkazuje na řetězec „action_gallery“, takže otevřete soubor res / value / strings.xml vašeho projektu a vytvořte tento zdroj. Zatímco jsem tady, definuji také další řetězce, které budeme používat v tomto projektu.

Galerie Tato aplikace potřebuje přístup k souborům ve vašem zařízení. Nebyl nalezen žádný text

Poté pomocí ikony Image Asset Studio vytvořte ikonu ic_gallery na panelu akcí:

  • Vyberte „Soubor> Nový> Aktiva obrázku“.
  • Nastavte rozbalovací nabídku „Typ ikon“ na „Ikony lišty akcí a karet“.
  • Klikněte na tlačítko „Klipart“.
  • Vyberte si drawable; Používám „image“.
  • Klikněte na „OK“.
  • Chcete-li zajistit, aby byla tato ikona na panelu akcí jasně viditelná, otevřete rozbalovací nabídku „Téma“ a vyberte „HOLO_DARK“.
  • Pojmenujte tuto ikonu „ic_gallery“.
  • „Klikněte na„ Další “a poté na„ Dokončit “.

Zpracování žádostí o oprávnění a kliknutí na události

Budu vykonávat všechny úkoly, které přímo nesouvisejí s rozhraním API pro rozpoznávání textu, v samostatné třídě BaseActivity, včetně okamžitého spuštění nabídky, zpracování událostí klepnutí na panelu akcí a vyžádání přístupu k úložišti zařízení.

  • Na panelu nástrojů aplikace Android Studio vyberte „Soubor> Nový> Třída Java“.
  • Pojmenujte tuto třídu „BaseActivity“.
  • Klikněte na „OK“.
  • Otevřete BaseActivity a přidejte následující:

import android.app.Activity; import android.support.v4.app.ActivityCompat; import android.support.v7.app.ActionBar; import android.support.v7.app.AlertDialog; importovat 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; importovat 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; public class BaseActivity rozšiřuje AppCompatActivity {public static final int WRITE_STORAGE = 100; veřejné statické finále int SELECT_PHOTO = 102; public static final String ACTION_BAR_TITLE = "action_bar_title"; public File photo; @Override chráněný void onCreate (@Nullable Bundle uloženInstanceState) {super.onCreate (uloženInstanceState); ActionBar actionBar = getSupportActionBar (); if (actionBar! = null) {actionBar.setDisplayHomeAsUpEnabled (true); actionBar.setTitle (getIntent (). getStringExtra (ACTION_BAR_TITLE)); }} @Override public boolean onCreateOptionsMenu (menu Menu) {getMenuInflater (). Inflate (R.menu.my_menu, menu); návrat true; } @Override public boolean onOptionsItemSelected (MenuItem item) {switch (item.getItemId ()) {// Pokud je vybrána „gallery_action“, pak ... // case R.id.gallery_action: //...check máme oprávnění WRITE_STORAGE // checkPermission (WRITE_STORAGE); přestávka; } return super.onOptionsItemSelected (item); } @Override public void onRequestPermissionsResult (int requestCode, @NonNull String oprávnění, @NonNull int grantResults) {super.onRequestPermissionsResult (requestCode, oprávnění, grantResults); switch (requestCode) {case WRITE_STORAGE: // Je-li žádost o povolení udělena, pak ... // if (grantResults.length> 0 && grantResults == PackageManager.PERMISSION_GRANTED) {//...call selectPicture // selectPicture ( ); // Pokud je žádost o povolení zamítnuta, pak ... //} else {//...display řetězec „Permation_request“ // requestPermission (this, requestCode, R.string.permission_request); } přestávka; }} // Zobrazí dialog žádosti o povolení // veřejné statické neplatné požadavekPermission (finální aktivita, konečný int requestCode, int msg) {AlertDialog.Builder alert = new AlertDialog.Builder (activity); alert.set (msg); alert.setPositiveButton (android.R.string.ok, nový DialogInterface.OnClickListener () {@Override public void onClick (DialogInterface dialogInterface, int i) {dialogInterface.dismiss (); Intent permissonIntent = new Intent (Settings.ACTION_APPLICATION_DETAILS) perm; .setData (Uri.parse ("package:" + activity.getPackageName ())); activity.startActivityForResult (permissonIntent, requestCode);}}); alert.setNegativeButton (android.R.string.cancel, nový DialogInterface.OnClickListener () {@Override public void onClick (DialogInterface dialogInterface, int i) {dialogInterface.dismiss ();}}); alert.setCancelable (false); alert.show (); } // Zkontrolujte, zda uživatel udělil oprávnění WRITE_STORAGE // public void checkPermission (int requestCode) {switch (requestCode) {case WRITE_STORAGE: int hasWriteExternalStoragePermission = ActivityCompat.checkSelfPermission (this, Manifest.permission.WRITE_EXTERNAL_STORAGE); // Pokud máme přístup k externímu úložišti ... // if (hasWriteExternalStoragePermission == PackageManager.PERMISSION_GRANTED) {//...call selectPicture, který zahajuje aktivitu, kde si uživatel může vybrat obrázek // selectPicture (); // Pokud povolení nebylo uděleno, pak ... //} else {//...request the oprávnění // ActivityCompat.requestPermissions (toto, nový String {Manifest.permission.WRITE_EXTERNAL_STORAGE}, requestCode); } přestávka; }} private void selectPicture () {photo = MyHelper.createTempFile (photo); Záměr = nový záměr (záměr.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); // Zahájení aktivity, kde si uživatel může vybrat obrázek // startActivityForResult (záměr, SELECT_PHOTO); }}

V tomto okamžiku by si měl váš projekt stěžovat, že nedokáže vyřešit MyHelper.createTempFile. Pojďme to implementovat hned!

Změna velikosti obrázků pomocí createTempFile

Vytvořte novou třídu „MyHelper“. V této třídě se chystáme změnit velikost vybraného obrázku uživatele, připraveného ke zpracování pomocí rozhraní API pro rozpoznávání textu.

import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.content.Context; import android.database.Cursor; import android.os.Environment; importovat android.widget.ImageView; import android.provider.MediaStore; import android.net.Uri; import statického android.graphics.BitmapFactory.decodeFile; import statického android.graphics.BitmapFactory.decodeStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class MyHelper {public static String getPath (kontextové souvislosti, Uri uri) {String path = ""; Řetězcová projekce = {MediaStore.Images.Media.DATA}; Kurzorový kurzor = context.getContentResolver (). Dotaz (uri, projekce, null, null, null); int column_index; if (cursor! = null) {column_index = cursor.getColumnIndexOrThrow (MediaStore.Images.Media.DATA); cursor.moveToFirst (); path = cursor.getString (column_index); cursor.close (); } zpáteční cesta; } public static File createTempFile (File file) {File directory = new File (Environment.getExternalStorageDirectory (). getPath () + "/com.jessicathornsby.myapplication"); if (! directory.exists () ||! directory.isDirectory ()) {directory.mkdirs (); } if (file == null) {file = new File (adresář, "orig.jpg"); } návratový soubor; } public static Bitmap resizePhoto (File imageFile, Context context, Uri uri, ImageView view) {BitmapFactory.Options newOptions = new BitmapFactory.Options (); zkuste {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 ()); return compressPhoto (imageFile, BitmapFactory.decodeStream (context.getContentResolver (). openInputStream (uri), null, newOptions)); } catch (výjimka FileNotFoundException) {výjimkou.printStackTrace (); návrat null; }} veřejná statická bitmapová resizePhoto (File imageFile, String path, ImageView view) {BitmapFactory.Options options = new BitmapFactory.Options (); decodeFile (cesta, možnosti); int photoHeight = options.outHeight; int photoWidth = options.outWidth; options.inSampleSize = Math.min (photoWidth / view.getWidth (), photoHeight / view.getHeight ()); return compressPhoto (imageFile, BitmapFactory.decodeFile (cesta, možnosti)); } soukromá statická bitmapová kompresePhoto (File photoFile, bitmapová bitmapa) {try {FileOutputStream fOutput = new FileOutputStream (photoFile); bitmap.compress (Bitmap.CompressFormat.JPEG, 70, fOutput); fOutput.close (); } catch (výjimka IOException) {výjimkou.printStackTrace (); } návratová bitmapa; }}

Nastavte obrázek na ImageView

Dále musíme implementovat onActivityResult () do naší třídy MainActivity a nastavit obrázek vybraný uživatelem na náš ImageView.

import android.graphics.Bitmap; import android.os.Bundle; importovat android.widget.ImageView; import android.content.Intent; import android.widget.TextView; import android.net.Uri; public class MainActivity rozšiřuje BaseActivity {private Bitmap myBitmap; soukromý ImageView myImageView; soukromý TextView myTextView; @Override chráněné void onCreate (Bundle uloženéInstanceState) {super.onCreate (uloženéInstanceState); setContentView (R.layout.activity_main); myTextView = findViewById (R.id.textView); myImageView = findViewById (R.id.imageView); } @Override chráněný void onActivityResult (int requestCode, int resultCode, Intent data) {super.onActivityResult (requestCode, resultCode, data); if (resultCode == RESULT_OK) {switch (requestCode) {case WRITE_STORAGE: checkPermission (requestCode); přestávka; case SELECT_PHOTO: Uri dataUri = data.getData (); String path = MyHelper.getPath (this, dataUri); if (path == null) {myBitmap = MyHelper.resizePhoto (foto, this, dataUri, myImageView); } else {myBitmap = MyHelper.resizePhoto (fotografie, cesta, myImageView); } if (myBitmap! = null) {myTextView.setText (null); myImageView.setImageBitmap (myBitmap); } přestávka; }}}}

Spusťte tento projekt na fyzickém zařízení Android nebo AVD a klikněte na ikonu panelu akcí. Po zobrazení výzvy udělte oprávnění WRITE_STORAGE a vyberte obrázek z galerie; tento obrázek by se nyní měl zobrazit v uživatelském rozhraní aplikace.

Nyní jsme položili základy, jsme připraveni začít extrahovat nějaký text!

Výuka aplikace rozpoznávat text

Chci spustit rozpoznávání textu v reakci na událost kliknutí, takže musíme implementovat OnClickListener:

import android.graphics.Bitmap; import android.os.Bundle; importovat android.widget.ImageView; import android.content.Intent; import android.widget.TextView; import android.view.View; import android.net.Uri; veřejná třída MainActivity rozšiřuje BaseActivity implementuje View.OnClickListener {private Bitmap myBitmap; soukromý ImageView myImageView; soukromý TextView myTextView; @Override chráněné void onCreate (Bundle uloženéInstanceState) {super.onCreate (uloženéInstanceState); setContentView (R.layout.activity_main); myTextView = findViewById (R.id.textView); myImageView = findViewById (R.id.imageView); findViewById (R.id.checkText) .setOnClickListener (this); } @Override public void onClick (View view) {switch (view.getId ()) {case R.id.checkText: if (myBitmap! = Null) {// V dalším kroku implementujeme runTextRecog // runTextRecog (); } přestávka; }}

Sada ML může zpracovávat obrázky pouze ve formátu FirebaseVisionImage, takže musíme převést náš obrázek na objekt FirebaseVisionImage. FirebaseVisionImage můžete vytvořit z bitmapy, media.Image, ByteBuffer nebo bajtového pole. Protože pracujeme s bitmapy, musíme zavolat metodu utility fromBitmap () třídy FirebaseVisionImage a předat ji našemu Bitmapu.

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

ML Kit má různé třídy detektorů pro každou ze svých operací rozpoznávání obrazu. Pro text musíme použít třídu FirebaseVisionTextDetector, která provádí optické rozpoznávání znaků (OCR) na obrázku.

Vytváříme instanci FirebaseVisionTextDetector pomocí getVisionTextDetector:

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

Dále musíme zkontrolovat text FirebaseVisionImage voláním metody DetInImage () a předáním objektu FirebaseVisionImage. Musíme také implementovat zpětná volání onSuccess a onFailure a odpovídající posluchače, aby naše aplikace dostávala oznámení, kdykoli budou k dispozici výsledky.

detector.detectInImage (image) .addOnSuccessListener (nový OnSuccessListener() {@Override // Úkoly //}}). AddOnFailureListener (nový OnFailureListener () {@Override veřejné neplatné onFailure (výjimka @NonNull) {// Úloha selhala s výjimkou //}})); }

Pokud tato operace selže, zobrazí se přípitek, ale pokud je operace úspěšná, zavolám s odpovědí procesExtractedText.

V tomto okamžiku můj kód pro detekci textu vypadá takto:

// Vytvořte FirebaseVisionImage // soukromý void runTextRecog () {FirebaseVisionImage image = FirebaseVisionImage.fromBitmap (myBitmap); // Vytvoření instance FirebaseVisionCloudTextDetector // FirebaseVisionTextDetector detector = FirebaseVision.getInstance (). GetVisionTextDetector (); // Zaregistrujte OnSuccessListener // detector.detectInImage (image) .addOnSuccessListener (nový OnSuccessListener)() {@Override // Implementace zpětného volání onSuccess // public void onSuccess (FirebaseVisionText documents) {// Call processExtractedText s odezvou // processExtractedText (texty); }}). addOnFailureListener (nový OnFailureListener () {@Override // Implementace onFailure calback // public void onFailure (@NonNull výjimka výjimka) {Toast.makeText (MainActivity.this, "Výjimka", Toast.LENGTH_LONG) .show ( );}}); }

Kdykoli naše aplikace obdrží oznámení onSuccess, musíme výsledky analyzovat.

Objekt FirebaseVisionText může obsahovat prvky, čáry a bloky, kde každý blok obvykle odpovídá jednomu odstavci textu. Pokud FirebaseVisionText vrátí 0 bloků, zobrazí se řetězec „no_text“, ale pokud obsahuje jeden nebo více bloků, zobrazený text se zobrazí jako součást našeho TextView.

private void processExtractedText (FirebaseVisionText firebaseVisionText) {myTextView.setText (null); if (firebaseVisionText.getBlocks (). size () == 0) {myTextView.setText (R.string.no_text); vrátit se; } pro (FirebaseVisionText.Block blok: firebaseVisionText.getBlocks ()) {myTextView.append (block.getText ()); }}}

Zde je vyplněný MainActivity kód:

import android.graphics.Bitmap; import android.os.Bundle; importovat android.widget.ImageView; import android.content.Intent; import android.widget.TextView; importovat 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; veřejná třída MainActivity rozšiřuje BaseActivity implementuje View.OnClickListener {private Bitmap myBitmap; soukromý ImageView myImageView; soukromý TextView myTextView; @Override chráněné void onCreate (Bundle uloženéInstanceState) {super.onCreate (uloženéInstanceState); setContentView (R.layout.activity_main); myTextView = findViewById (R.id.textView); myImageView = findViewById (R.id.imageView); findViewById (R.id.checkText) .setOnClickListener (this); } @Override public void onClick (View view) {switch (view.getId ()) {case R.id.checkText: if (myBitmap! = Null) {runTextRecog (); } přestávka; }} @Override chráněný void onActivityResult (int requestCode, int resultCode, Intent data) {super.onActivityResult (requestCode, resultCode, data); if (resultCode == RESULT_OK) {switch (requestCode) {case WRITE_STORAGE: checkPermission (requestCode); přestávka; case SELECT_PHOTO: Uri dataUri = data.getData (); String path = MyHelper.getPath (this, dataUri); if (path == null) {myBitmap = MyHelper.resizePhoto (foto, this, dataUri, myImageView); } else {myBitmap = MyHelper.resizePhoto (fotografie, cesta, myImageView); } if (myBitmap! = null) {myTextView.setText (null); myImageView.setImageBitmap (myBitmap); } přestávka; }}} soukromé neplatné runTextRecog () {FirebaseVisionImage image = FirebaseVisionImage.fromBitmap (myBitmap); Detektor FirebaseVisionTextDetector = FirebaseVision.getInstance (). GetVisionTextDetector (); detector.detectInImage (image) .addOnSuccessListener (nový OnSuccessListener() {@Override public void onSuccess (FirebaseVisionText documents) {processExtractedText (texty); }}). addOnFailureListener (nový OnFailureListener () {@Override public void onFailure (@NonNull výjimka výjimka) {Toast.makeText (MainActivity.this, "Výjimka", Toast.LENGTH_LONG) .show ();}}); } private void processExtractedText (FirebaseVisionText firebaseVisionText) {myTextView.setText (null); if (firebaseVisionText.getBlocks (). size () == 0) {myTextView.setText (R.string.no_text); vrátit se; } pro (FirebaseVisionText.Block blok: firebaseVisionText.getBlocks ()) {myTextView.append (block.getText ()); }}}

Testování projektu

Nyní je čas vidět rozpoznávání textu ML Kit v akci! Nainstalujte tento projekt na zařízení Android nebo AVD, vyberte obrázek z galerie a poté klepněte na tlačítko „Zkontrolovat text“. Aplikace by měla odpovědět tak, že z obrázku vyjme veškerý text a poté jej zobrazí v TextView.

Uvědomte si, že v závislosti na velikosti obrázku a množství textu, které obsahuje, budete možná muset procházet, aby se zobrazil veškerý extrahovaný text.

Dokončený projekt si také můžete stáhnout z GitHubu.

Zabalení

Nyní víte, jak detekovat a extrahovat text z obrázku pomocí sady ML Kit.

Rozhraní API pro rozpoznávání textu je pouze jednou součástí sady ML. Tato sada SDK také nabízí skenování čárových kódů, detekci obličeje, označování obrázků a rozpoznávání orientačních bodů, s plány přidat další API pro běžné případy použití v mobilních zařízeních, včetně inteligentní odpovědi a rozhraní API s vysokou hustotou obličeje.

Které rozhraní ML Kit API vás nejvíce zajímá? Dejte nám vědět v komentářích níže!

Halloween není jediný ča, jak i užít dobré vyděšení! Amazon Prime Video pokytuje obrovký výběr hororových pohybů, od klaických monter filmů tiché ...

Houe of Marley, audio polečnot uznávaná pro vé přímé vazby na Bob Marley a příbuzného, ​​e zaměřuje na udržitelnot. Zahajoval CE 2019 širokou škálou produktů še...

Zajímavý