Bagaimana untuk mengambil teks dari imej dengan SDK Belajar Mesin Google

Pengarang: John Stephens
Tarikh Penciptaan: 27 Januari 2021
Tarikh Kemas Kini: 5 Julai 2024
Anonim
Temb4k Jatuh Kuntilanak Terbang Dengan Ribuan Kembang Api Sampai Terbak4r!! (Spesial Tahun Baru)
Video.: Temb4k Jatuh Kuntilanak Terbang Dengan Ribuan Kembang Api Sampai Terbak4r!! (Spesial Tahun Baru)

Kandungan


Anda juga boleh menggunakan API Pengiktirafan Teks sebagai asas untuk aplikasi penterjemahan, atau perkhidmatan kebolehaksesan di mana pengguna boleh menunjuk kamera mereka di mana-mana teks yang mereka perjuangkan, dan membacanya dengan kuat kepada mereka.

Dalam tutorial ini, kami akan meletakkan asas untuk pelbagai ciri inovatif, dengan membuat aplikasi yang boleh mengekstrak teks dari mana-mana imej di galeri pengguna. Walaupun kami tidak akan menyertakannya dalam tutorial ini, anda juga boleh menangkap teks dari persekitaran pengguna dalam masa nyata, dengan menyambungkan aplikasi ini ke kamera peranti.

Pada peranti atau di awan?

Sebahagian daripada API Kit ML hanya tersedia di peranti, tetapi beberapa tersedia di peranti dan di awan, termasuk API Pengiktirafan Teks.

API Teks berasaskan awan boleh mengenal pasti pelbagai bahasa dan aksara yang lebih luas, dan menjanjikan ketepatan yang lebih besar daripada rakan sejawatannya. Walau bagaimanapun, ia tidak memerlukan sambungan Internet yang aktif, dan hanya tersedia untuk projek-projek peringkat Blaze.


Dalam artikel ini, kami akan menjalankan API Pengiktirafan Teks secara tempatan, supaya anda boleh mengikuti tanpa mengira sama ada anda telah dinaik taraf kepada Blaze, atau anda menggunakan pelan Spark Firebase percuma.

Mewujudkan apl pengiktirafan teks dengan Kit ML

Buat aplikasi dengan tetapan pilihan anda, tetapi apabila diminta memilih templat "Aktiviti Kosong".

ML Kit SDK adalah sebahagian daripada Firebase, jadi anda perlu menyambungkan projek anda ke Firebase, menggunakan sijil menandatangani SHA-1. Untuk mendapatkan SHA-1 projek anda:

  • Pilih tab "Gradle" Android Studio.
  • Dalam panel "Gradle projects", klik dua kali untuk mengembangkan "root" projek anda, kemudian pilih "Tugas> Android> Laporan Tandatangan."
  • Panel di sepanjang bahagian bawah tetingkap Android Studio harus dikemas kini untuk memaparkan beberapa maklumat mengenai projek ini - termasuk sijil menandatangani SHA-1.


Untuk menyambung projek anda kepada Firebase:

  • Dalam pelayar web anda, luncurkan Konsol Firebase.
  • Pilih "Tambah projek."
  • Berikan projek anda sebagai nama; Saya menggunakan "ML Test."
  • Baca terma dan syarat, dan jika anda gembira untuk meneruskan kemudian pilih "Saya terima ..." diikuti dengan "Buat projek."
  • Pilih "Tambah Firebase ke aplikasi Android anda."
  • Masukkan nama pakej projek anda, yang akan anda dapati di bahagian atas fail MainAktiviti, dan dalam Manifes.
  • Masukkan sijil menandatangani SHA-1 projek anda.
  • Klik "Daftar aplikasi."
  • Pilih "Muat turun google-services.json." Fail ini mengandungi semua metadata Firebase yang diperlukan untuk projek anda, termasuk kunci API.
  • Di Android Studio, seret dan lepaskan fail google-services.json ke dalam direktori aplikasi "aplikasinya."

  • Buka fail build.gradle peringkat projek anda dan tambah classpath perkhidmatan Google:

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

  • Buka fail build.gradle tahap aplikasi anda, dan tambahkan dependensi untuk Firebase Core, Firebase ML Vision dan penterjemah model, serta plugin perkhidmatan Google:

memohon plugin: com.google.gms.google-services ... ... ... dependencies {implementation fileTree (dir: libs, include:) implementation com.google.firebase: firebase-core: 16.0.1 implementation com. google.firebase: firebase-ml-vision: 16.0.0 implementation com.google.firebase: firebase-ml-model-interpreter: 16.0.0

Pada ketika ini, anda perlu menjalankan projek anda supaya ia boleh menyambung ke pelayan Firebase:

  • Pasang apl anda pada sama ada telefon pintar atau tablet Android fizikal, atau Peranti Maya Maya (AVD).
  • Dalam Konsol Firebase, pilih "Jalankan apl untuk mengesahkan pemasangan."
  • Selepas beberapa saat, anda perlu melihat "Tahniah"; pilih "Teruskan ke konsol."

Muat turun model pembelajaran mesin pra terlatih Google

Secara lalai, ML Kit hanya memuat model apabila diperlukan, jadi aplikasi kami akan memuat turun model OCR apabila pengguna cuba untuk mengekstrak teks untuk kali pertama.

Ini berpotensi memberi kesan negatif terhadap pengalaman pengguna - bayangkan cuba mengakses ciri, hanya untuk mengetahui bahawa aplikasi itu harus memuatkan lebih banyak sumber sebelum sebenarnya dapat menyampaikan ciri ini. Dalam senario kes terburuk, aplikasi anda mungkin tidak dapat memuat turun sumber-sumber yang diperlukan, apabila ia memerlukannya, misalnya jika peranti tidak mempunyai sambungan Internet.

Untuk memastikan ini tidak berlaku dengan aplikasi kami, saya akan memuat turun model OCR yang diperlukan pada masa pemasangan, yang memerlukan beberapa perubahan kepada Maniest.

Walaupun kami mempunyai Terbuka yang Manifes, saya juga akan menambah kebenaran WRITE_EXTERNAL_STORAGE, yang akan kami gunakan kemudian dalam tutorial ini.

// Tambah kebenaran WRITE_EXTERNAL_STORAGE // // Tambah berikut //

Membina susun atur

Mari kita dapatkan barang mudah, dan buat susun atur yang terdiri daripada:

  • ImageView. Pada mulanya, ini akan memaparkan pemegang tempat, tetapi ia akan dikemas kini apabila pengguna memilih imej dari galeri mereka.
  • A Button, yang mencetuskan pengekstrakan teks.
  • TextView, di mana kita akan memaparkan teks yang diekstrak.
  • A ScrollView. Oleh kerana tidak ada jaminan teks yang diekstrak akan sesuai dengan skrin, saya akan meletakkan TextView di dalam ScrollView.

Inilah file activity_main.xml yang telah selesai:

Susun atur ini merujuk kepada "ic_placeholder" yang boleh dilukis, jadi mari buat sekarang sekarang:

  • Pilih "Fail> New> Image Asset" dari bar alat Android Studio.
  • Buka dropdown "Jenis Ikon" dan pilih "Bar Tindakan dan Ikon Tab."
  • Pastikan butang radio "Klip Art" dipilih.
  • Beri satu klik "Art Clip".
  • Pilih imej yang anda mahu gunakan sebagai pemegang tempat anda; Saya menggunakan "Tambah ke foto."
  • Klik "OK."
  • Buka dropdown "Tema", dan pilih "HOLO_LIGHT."
  • Dalam medan "Nama", masukkan "ic_placeholder."
  • Klik "Seterusnya." Baca maklumat, dan jika anda gembira untuk meneruskan kemudian klik "Selesaikan."

Ikon bar Tindakan: Melancarkan aplikasi Galeri

Seterusnya, saya akan membuat item bar tindakan yang akan melancarkan galeri pengguna, bersedia untuk mereka memilih imej.

Anda menentukan ikon bar tindakan di dalam fail sumber menu, yang tinggal di dalam direktori "res / menu". Jika projek anda tidak mengandungi direktori ini, maka anda perlu menciptanya:

  • Kawalan-klik direktori "res" projek anda dan pilih "New> Direktori Sumber Android."
  • Buka menu dropdown "Jenis Sumber" dan pilih "."
  • "Nama direktori" perlu dikemas kini ke "menu" secara automatik, tetapi jika tidak maka anda perlu menamakan semula secara manual.
  • Klik "OK."

Anda kini bersedia untuk mencipta fail sumber menu:

  • Kawalan-klik direktori "menu" projek anda dan pilih "New> Menu resource menu."
  • Namakan fail ini "my_menu."
  • Klik "OK."
  • Buka fail "my_menu.xml", dan tambahkan yang berikut:

// Buat satu elemen untuk setiap tindakan //

Fail menu merujuk rentetan "action_gallery", jadi buka fail res / nilai / strings.xml projek anda dan buat sumber ini. Semasa saya di sini, saya juga menentukan rentetan lain yang akan kita gunakan sepanjang projek ini.

Galeri Aplikasi ini perlu mengakses fail pada peranti anda. Tiada teks dijumpai

Seterusnya, gunakan Image Asset Studio untuk membuat ikon "ic_gallery" bar tindakan:

  • Pilih "Fail> Baru> Aset Imej."
  • Tetapkan dropdown "Jenis Ikon" ke "Ikon Tindakan dan Ikon Tab."
  • Klik butang "Klip Art".
  • Pilih yang boleh dilukis; Saya menggunakan "imej."
  • Klik "OK."
  • Untuk memastikan ikon ini dapat dilihat dengan jelas di bar tindakan, buka menu "Tema" dan pilih "HOLO_DARK."
  • Namakan ikon ini "ic_gallery."
  • "Klik" Seterusnya, "diikuti dengan" Selesai. "

Menangani permintaan kebenaran dan klik acara

Saya akan melaksanakan semua tugas yang tidak berkaitan secara langsung dengan API Pengiktirafan Teks dalam kelas BaseActivity yang berasingan, termasuk menstabilkan menu, menangani peristiwa klik bar tindakan, dan meminta akses ke storan peranti.

  • Pilih "Fail> Baru> kelas Java" dari bar alat Android Studio.
  • Namakan kelas ini "BaseActivity."
  • Klik "OK."
  • Buka BaseActivity, dan tambah yang berikut:

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; BaseActivity kelas awam memanjangkan AppCompatActivity {int awam akhir statik WRITE_STORAGE = 100; int akhir awam statik SELECT_PHOTO = 102; String akhir statik awam ACTION_BAR_TITLE = "action_bar_title"; foto fail awam; @Override dilindungi tidak sah onCreate (@Nullable Bundle savedInstanceState) {super.onCreate (savedInstanceState); ActionBar actionBar = getSupportActionBar (); jika (actionBar! = null) {actionBar.setDisplayHomeAsUpEnabled (true); actionBar.setTitle (getIntent (). getStringExtra (ACTION_BAR_TITLE)); }} @Orrride public boolean onCreateOptionsMenu (menu Menu) {getMenuInflater (). Inflate (R.menu.my_menu, menu); kembali benar; } @Override public boolean onOptionsItemSelected (item MenuItem) {switch (item.getItemId ()) {// If "gallery_action" dipilih, maka ... // case R.id.gallery_action: //...check we have kebenaran WRITE_STORAGE // checkPermission (WRITE_STORAGE); pecah; } kembali super.onOptionsItemSelected (item); } @Override public void onRequestPermissionsResult (int requestCode, @NonNull String permissions, @NonNull int grantResults) {super.onRequestPermissionsResult (requestCode, permissions, grantResults); suis (requestCode) {case WRITE_STORAGE: // Jika permintaan kebenaran diberikan, maka ... // if (grantResults.length> 0 && grantResults == PackageManager.PERMISSION_GRANTED) {//...call selectPicture // selectPicture ( ); // Jika permintaan kebenaran dinafikan, maka ... //} else {//...display the "permission_request" string // requestPermission (this, requestCode, R.string.permission_request); } pecah; }} // Paparkan dialog permintaan izin // permintaan awam static void RequestPermission (aktiviti Akhir aktiviti, int finalCode, int msg) {AlertDialog.Builder alert = baru AlertDialog.Builder (aktiviti); alert.set (msg); alert.setPositiveButton (android.R.string.ok, new DialogInterface.OnClickListener () {@Override public void onClick (DialogInterface dialogInterface, int i) {dialogInterface.dismiss (); Intent permissonIntent = Intent new (Settings.ACTION_APPLICATION_DETAILS_SETTINGS); permissonIntent .setData (Uri.parse ("package:" + activity.getPackageName ())); activity.startActivityForResult (permissonIntent, requestCode);}}); alert.setNegativeButton (android.R.string.cancel, new DialogInterface.OnClickListener () {@Override public void onClick (DialogInterface dialogInterface, int i) {dialogInterface.dismiss ();}}); alert.setCancelable (false); alert.show (); } // Periksa sama ada pengguna telah memberikan izin WRITE_STORAGE // public checkPermission (int requestCode) {switch (requestCode) {case WRITE_STORAGE: int hasWriteExternalStoragePermission = ActivityCompat.checkSelfPermission (this, Manifest.permission.WRITE_EXTERNAL_STORAGE); // Jika kami mempunyai akses ke storan luar ... // jika (hasWriteExternalStoragePermission == PackageManager.PERMISSION_GRANTED) {//...call selectPicture, yang melancarkan Aktiviti dimana pengguna boleh memilih gambar // selectPicture (); // Jika kebenaran tidak diberikan, maka ... //} lain {// ...minta izin // ActivityCompat.requestPermissions (ini, String baru {Manifest.permission.WRITE_EXTERNAL_STORAGE}, requestCode); } pecah; }} kekosongan peribadi pilihPicture () {photo = MyHelper.createTempFile (foto); Niat niat = niat baru (Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); // Memulakan Aktiviti di mana pengguna boleh memilih imej // startActivityForResult (niat, SELECT_PHOTO); }}

Pada ketika ini, projek anda harus mengeluh bahawa ia tidak dapat menyelesaikan MyHelper.createTempFile. Mari laksanakan sekarang!

Saiz semula imej dengan createTempFile

Buat kelas "MyHelper" baharu. Dalam kelas ini, kami akan mengubah saiz imej pilihan pengguna, sedia diproses oleh API Pengiktirafan Teks.

import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.content.Context; import android.database.Cursor; import android.os.Environment; import android.widget.ImageView; import android.provider.MediaStore; import android.net.Uri; mengimport statik android.graphics.BitmapFactory.decodeFile; mengimport statik android.graphics.BitmapFactory.decodeStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; kelas awam MyHelper {public static String getPath (Konteks konteks, Uri uri) {String path = ""; Unjuran rentetan = {MediaStore.Images.Media.DATA}; Kursor kursor = context.getContentResolver (). Pertanyaan (jenis, unjuran, null, null, null); int column_index; jika (kursor! = null) {column_index = cursor.getColumnIndexOrThrow (MediaStore.Images.Media.DATA); cursor.moveToFirst (); path = cursor.getString (column_index); cursor.close (); } laluan kembali; } fail statik awam createTempFile (Fail fail) {Direktori fail = Fail baru (Environment.getExternalStorageDirectory (). getPath () + "/com.jessicathornsby.myapplication"); jika (! directory.exists () ||! directory.isDirectory ()) {directory.mkdirs (); } jika (fail == null) {fail = Fail baru (direktori, "orig.jpg"); } memulangkan fail; } public static bitmap resizePhoto (konteks konteks fail, konteks konteks, uri jenis, paparan ImageView) {BitmapFactory.Options newOptions = new BitmapFactory.Options (); cuba {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 ()); kembali compressPhoto (imageFile, BitmapFactory.decodeStream (context.getContentResolver (). openInputStream (uri), null, newOptions)); } tangkapan (pengecualian FileNotFoundException) {exception.printStackTrace (); pulangan null; }} resit Bitmap statik awam (File imageFile, Laluan rentetan, paparan ImageView) {BitmapFactory.Options options = new BitmapFactory.Options (); decodeFile (path, options); int photoHeight = options.outHeight; int photoWidth = options.outWidth; options.inSampleSize = Math.min (photoWidth / view.getWidth (), photoHeight / view.getHeight ()); kembali compressPhoto (imageFile, BitmapFactory.decodeFile (path, options)); } medan statik peribadi compressPhoto (File photoFile, bitmap bitmap) {cuba {FileOutputStream fOutput = FileOutputStream baru (photoFile); bitmap.compress (Bitmap.CompressFormat.JPEG, 70, fOutput); fOutput.close (); } menangkap (pengecualian IOException) {exception.printStackTrace (); } kembali bitmap; }}

Tetapkan imej ke ImageView

Seterusnya, kami perlu melaksanakan onActivityResult () dalam kelas MainActivity kami, dan tetapkan imej yang dipilih pengguna untuk ImageView kami.

import android.graphics.Bitmap; import android.os.Bundle; import android.widget.ImageView; import android.content.Intent; import android.widget.TextView; import android.net.Uri; MainActivity kelas awam meluaskan BaseActivity {bitbit peribadi myBitmap; swasta ImageView myImageView; peribadi TextView myTextView; @Override dilindungi tidak sah onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); myTextView = findViewById (R.id.textView); myImageView = findViewById (R.id.imageView); } @Override dilindungi tidak sah padaActivityResult (int requestCode, int resultCode, data niat) {super.onActivityResult (requestCode, resultCode, data); jika (resultCode == RESULT_OK) {switch (requestCode) {case WRITE_STORAGE: checkPermission (requestCode); pecah; kes SELECT_PHOTO: Uri dataUri = data.getData (); Laluan rentetan = MyHelper.getPath (ini, dataUri); jika (path == null) {myBitmap = MyHelper.resizePhoto (foto, ini, dataUri, myImageView); } else {myBitmap = MyHelper.resizePhoto (foto, laluan, myImageView); } jika (myBitmap! = null) {myTextView.setText (null); myImageView.setImageBitmap (myBitmap); } pecah; }}}}}

Jalankan projek ini pada peranti Android fizikal atau AVD, dan berikan ikon bar aksi satu klik. Apabila diminta, berikan kebenaran WRITE_STORAGE dan pilih imej dari galeri; imej ini kini seharusnya dipaparkan dalam UI aplikasinya.

Kini kami telah meletakkan asasnya, kami bersedia untuk memulakan mengekstrak beberapa teks!

Mengajar aplikasi untuk mengenali teks

Saya ingin mencetuskan pengiktirafan teks sebagai tindak balas kepada peristiwa klik, jadi kita perlu melaksanakan OnClickListener:

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; MainActivity kelas awam meluaskan BaseActivity mengimplementasikan View.OnClickListener {private bitmap myBitmap; swasta ImageView myImageView; peribadi TextView myTextView; @Override dilindungi tidak sah 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 (ini); } @Override public void onClick (Lihat view) {switch (view.getId ()) {case R.id.checkText: if (myBitmap! = Null) {// We will implement runTextRecog in next step // runTextRecog (); } pecah; }}

ML Kit hanya boleh memproses imej apabila mereka berada dalam format FirebaseVisionImage, jadi kita perlu menukar imej kita menjadi objek FirebaseVisionImage. Anda boleh membuat FirebaseVisionImage dari Bitmap, media.Image, ByteBuffer, atau array byte. Oleh kerana kami bekerja dengan Bitmap, kami perlu memanggil kaedah utiliti dariBitmap () dari kelas FirebaseVisionImage, dan lulus Bitmap kami.

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

ML Kit mempunyai kelas pengesan yang berbeza untuk setiap operasi pengiktirafan imejnya. Untuk teks, kita perlu menggunakan kelas FirebaseVisionTextDetector, yang melakukan pengecaman aksara optik (OCR) pada imej.

Kami membuat contoh FirebaseVisionTextDetector, menggunakan getVisionTextDetector:

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

Seterusnya, kita perlu menyemak FirebaseVisionImage untuk teks, dengan memanggil kaedah detectInImage () dan lulus objek FirebaseVisionImage. Kami juga perlu melaksanakan onSuccess dan panggilan balik OnFailure, serta pendengar yang sepadan supaya apl kami akan dimaklumkan apabila keputusan diperoleh.

detector.detectInImage (image) .addOnSuccessListener (new OnSuccessListener() {@Override // To do //}}). AddOnFailureListener (new OnFailureListener () {@Override public void onFailure (@NonNull Exception Exception) {// Task failed exception //}}); }

Jika operasi ini gagal, maka saya akan memaparkan roti panggang, tetapi jika operasi itu berjaya maka saya akan panggil processExtractedText dengan respons.

Pada ketika ini, kod pengesanan teks saya kelihatan seperti ini:

// Buat FirebaseVisionImage // private void runTextRecog () {FirebaseVisionImage image = FirebaseVisionImage.fromBitmap (myBitmap); // Buat contoh firebaseVisionCloudTextDetector // FirebaseVisionTextDetector detector = FirebaseVision.getInstance (). GetVisionTextDetector (); // Daftar OnSuccessListener // detector.detectInImage (image) .addOnSuccessListener (OnSuccessListener baru() {@Orrride // Melaksanakan panggilan balik onSuccess // undian awam onSuccess (FirebaseVisionText texts) {// Proses panggilan ExtractedText dengan respon // processExtractedText (teks); }}). addOnFailureListener (baru OnFailureListener () {@Override // Melaksanakan onFailure calback // void public onFailure (@NonNull Exception Exception) {Toast.makeText (MainActivity.this, "Exception", Toast.LENGTH_LONG) .show );}}); }

Apabila aplikasi kami menerima pemberitahuan onSuccess, kami perlu menghuraikan hasilnya.

Objek FirebaseVisionText boleh mengandungi elemen, baris dan blok, di mana setiap blok biasanya sama dengan satu perenggan teks. Jika FirebaseVisionText mengembalikan 0 blok, maka kami akan memaparkan rentetan "no_text", tetapi jika ia mengandungi satu atau lebih blok maka kami akan memaparkan teks yang diambil sebagai sebahagian daripada TextView kami.

private void processExtractedText (FirebaseVisionText firebaseVisionText) {myTextView.setText (null); jika (firebaseVisionText.getBlocks (). size () == 0) {myTextView.setText (R.string.no_text); kembali; } untuk (FirebaseVisionText.Block block: firebaseVisionText.getBlocks ()) {myTextView.append (block.getText ()); }}}

Inilah kod MainActivity yang lengkap:

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; MainActivity kelas awam meluaskan BaseActivity mengimplementasikan View.OnClickListener {private bitmap myBitmap; swasta ImageView myImageView; peribadi TextView myTextView; @Override dilindungi tidak sah 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 (ini); } @Override public void onClick (view view) {switch (view.getId ()) {case R.id.checkText: if (myBitmap! = Null) {runTextRecog (); } pecah; }} @Orrride dilindungi tidak sah padaActivityResult (int requestCode, int resultCode, data niat) {super.onActivityResult (requestCode, resultCode, data); jika (resultCode == RESULT_OK) {switch (requestCode) {case WRITE_STORAGE: checkPermission (requestCode); pecah; kes SELECT_PHOTO: Uri dataUri = data.getData (); Laluan rentetan = MyHelper.getPath (ini, dataUri); jika (path == null) {myBitmap = MyHelper.resizePhoto (foto, ini, dataUri, myImageView); } else {myBitmap = MyHelper.resizePhoto (foto, laluan, myImageView); } jika (myBitmap! = null) {myTextView.setText (null); myImageView.setImageBitmap (myBitmap); } pecah; }}} private void runTextRecog () {FirebaseVisionImage image = FirebaseVisionImage.fromBitmap (myBitmap); Pengesan FirebaseVisionTextDetector = FirebaseVision.getInstance (). GetVisionTextDetector (); detector.detectInImage (image) .addOnSuccessListener (new OnSuccessListener() {@Override void public onSuccess (FirebaseVisionText texts) {processExtractedText (texts); }}). addOnFailureListener (new OnFailureListener () {@Override public void onFailure (@NonNull Exception Exception) {Toast.makeText (MainActivity.this, "Exception", Toast.LENGTH_LONG) .show ();}}); } private void processExtractedText (FirebaseVisionText firebaseVisionText) {myTextView.setText (null); jika (firebaseVisionText.getBlocks (). size () == 0) {myTextView.setText (R.string.no_text); kembali; } untuk (FirebaseVisionText.Block block: firebaseVisionText.getBlocks ()) {myTextView.append (block.getText ()); }}}

Menguji projek

Kini tiba masanya untuk melihat Pengiktirafan Teks ML Kit dalam tindakan! Pasang projek ini pada peranti Android atau AVD, pilih imej dari galeri, dan kemudian berikan butang "Semak teks" satu paip. Aplikasi ini harus bertindak balas dengan mengekstrak semua teks dari imej, dan kemudian memaparkannya dalam TextView.

Ambil perhatian bahawa bergantung kepada saiz imej anda dan jumlah teks yang terkandung, anda mungkin perlu menatal untuk melihat semua teks yang diekstrak.

Anda juga boleh memuat turun projek yang telah siap dari GitHub.

Mengakhiri

Anda kini tahu cara mengesan dan mengekstrak teks dari imej, menggunakan Kit ML.

API Pengiktirafan Teks hanyalah sebahagian daripada Kit ML. SDK ini juga menawarkan pengimbasan kod bar, pengesanan muka, pelabelan imej dan pengiktirafan mercu tanda, dengan rancangan untuk menambah lebih banyak API untuk kes penggunaan mudah alih yang sama, termasuk Balas Pintar dan API kontur wajah berkepadatan tinggi.

API Kit ML mana yang anda paling berminat untuk mencuba? Beritahu kami dalam komen di bawah!

Dietogen ketogenik (atau hanya, diet keto) mengambil wap. Orang ramai mempamerkan hail poitif di eluruh tempat. Pada daarnya, ia adalah diet karbohidrat yang rendah yang menggalakkan ketoi. Diet yang...

Paaran telefon pintar premium meningkat ebanyak 18 peratu tahun lepa berbanding ebelumnya.Paar telefon pintar ultra-premium dikuaai oleh Apple dengan 80 peratu aham.Data ini menunjukkan bahawa penggun...

Pilihan Tapak.