Cara mengekstrak teks dari gambar dengan Machine Learning SDK Google

Pengarang: John Stephens
Tanggal Pembuatan: 27 Januari 2021
Tanggal Pembaruan: 5 Juli 2024
Anonim
Google Vision API in Python (Part 3): Detect and Extract Text (Image)
Video: Google Vision API in Python (Part 3): Detect and Extract Text (Image)

Isi


Anda juga bisa menggunakan Text Recognition API sebagai dasar untuk aplikasi terjemahan, atau layanan aksesibilitas di mana pengguna dapat mengarahkan kamera mereka ke teks apa pun yang mereka perjuangkan, dan membacanya keras-keras kepada mereka.

Dalam tutorial ini, kami akan meletakkan dasar untuk berbagai fitur inovatif, dengan membuat aplikasi yang dapat mengekstraksi teks dari gambar apa pun di galeri pengguna. Meskipun kami tidak akan membahasnya dalam tutorial ini, Anda juga dapat menangkap teks dari lingkungan pengguna secara langsung, dengan menghubungkan aplikasi ini ke kamera perangkat.

Di perangkat atau di cloud?

Beberapa API Kit ML hanya tersedia di perangkat, tetapi beberapa tersedia di perangkat dan di cloud, termasuk API Pengenalan Teks.

API Teks berbasis cloud dapat mengidentifikasi rentang bahasa dan karakter yang lebih luas, dan menjanjikan akurasi yang lebih besar daripada rekannya di perangkat. Namun demikian tidak memerlukan koneksi Internet aktif, dan hanya tersedia untuk proyek tingkat Blaze.


Di artikel ini, kami akan menjalankan API Pengenalan Teks secara lokal, sehingga Anda dapat mengikuti tanpa menghiraukan apakah Anda telah ditingkatkan ke Blaze, atau Anda menggunakan paket Firebase Spark gratis.

Membuat aplikasi pengenalan teks dengan ML Kit

Buat aplikasi dengan pengaturan pilihan Anda, tetapi ketika diminta pilih templat "Empty Activity".

ML Kit SDK adalah bagian dari Firebase, jadi Anda harus menghubungkan proyek Anda ke Firebase, menggunakan sertifikat penandatanganan SHA-1-nya. Untuk mendapatkan SHA-1 proyek Anda:

  • Pilih tab "Gradle" Android Studio.
  • Di panel "Proyek bertahap", klik dua kali untuk memperluas "root" proyek Anda, lalu pilih "Tugas> Android> Laporan Penandatanganan."
  • Panel di bagian bawah jendela Android Studio harus memperbarui untuk menampilkan beberapa informasi tentang proyek ini - termasuk sertifikat penandatanganan SHA-1-nya.


Untuk menghubungkan proyek Anda ke Firebase:

  • Di browser web Anda, luncurkan Firebase Console.
  • Pilih "Tambah proyek."
  • Beri nama proyek Anda; Saya menggunakan "Tes ML."
  • Baca syarat dan ketentuan, dan jika Anda senang melanjutkan maka pilih "Saya menerima ..." diikuti oleh "Buat proyek."
  • Pilih "Tambahkan Firebase ke aplikasi Android Anda."
  • Masukkan nama paket proyek Anda, yang akan Anda temukan di bagian atas file MainActivity, dan di dalam Manifest.
  • Masukkan sertifikat penandatanganan SHA-1 proyek Anda.
  • Klik "Daftarkan aplikasi."
  • Pilih "Unduh google-services.json." File ini berisi semua metadata Firebase yang diperlukan untuk proyek Anda, termasuk kunci API.
  • Di Android Studio, seret dan letakkan file google-services.json ke direktori "aplikasi" proyek Anda.

  • Buka file build.gradle tingkat proyek Anda dan tambahkan classpath layanan Google:

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

  • Buka file build.gradle tingkat aplikasi Anda, dan tambahkan dependensi untuk Firebase Core, Firebase ML Vision, dan juru bahasa model, plus plugin layanan Google:

terapkan plugin: com.google.gms.google-services ... ... ... dependency {file implementasi implementasi (dir: libs, termasuk:) implementasi com.google.firebase: firebase-core: 16.0.1 implementasi com. google.firebase: firebase-ml-vision: 16.0.0 implementasi com.google.firebase: firebase-ml-model-interpreter: 16.0.0

Pada titik ini, Anda harus menjalankan proyek Anda agar dapat terhubung ke server Firebase:

  • Instal aplikasi Anda di smartphone atau tablet Android fisik, atau Android Virtual Device (AVD).
  • Di Firebase Console, pilih "Jalankan aplikasi untuk memverifikasi pemasangan."
  • Setelah beberapa saat, Anda akan melihat "Selamat"; pilih "Lanjutkan ke konsol."

Unduh model pembelajaran mesin Google yang telah dilatih sebelumnya

Secara default, Kit ML hanya mengunduh model sesuai kebutuhan mereka, jadi aplikasi kami akan mengunduh model OCR saat pengguna mencoba mengekstraksi teks untuk pertama kalinya.

Hal ini berpotensi berdampak negatif pada pengalaman pengguna - bayangkan mencoba mengakses fitur, hanya untuk mengetahui bahwa aplikasi tersebut harus mengunduh lebih banyak sumber daya sebelum benar-benar dapat menghadirkan fitur ini. Dalam skenario terburuk, aplikasi Anda bahkan mungkin tidak dapat mengunduh sumber daya yang diperlukan, saat dibutuhkan, misalnya jika perangkat tidak memiliki koneksi internet.

Untuk memastikan ini tidak terjadi pada aplikasi kami, saya akan mengunduh model OCR yang diperlukan pada waktu instalasi, yang memerlukan beberapa perubahan pada Maniest.

Sementara kami memiliki Manifest terbuka, saya juga akan menambahkan izin WRITE_EXTERNAL_STORAGE, yang akan kami gunakan nanti dalam tutorial ini.

// Tambahkan izin WRITE_EXTERNAL_STORAGE // // Tambahkan berikut //

Membangun tata letak

Mari kita singkirkan hal-hal mudah, dan buat tata letak yang terdiri dari:

  • ImageView. Awalnya, ini akan menampilkan tempat penampung, tetapi akan diperbarui setelah pengguna memilih gambar dari galeri mereka.
  • Tombol, yang memicu ekstraksi teks.
  • A TextView, tempat kami akan menampilkan teks yang diekstraksi.
  • A ScrollView. Karena tidak ada jaminan teks yang diekstrak akan muat dengan rapi di layar, saya akan menempatkan TextView di dalam ScrollView.

Inilah file activity_main.xml yang sudah selesai:

Tata letak ini merujuk pada "ic_placeholder" yang dapat digambar, jadi mari kita buat ini sekarang:

  • Pilih "File> New> Image Asset" dari bilah alat Android Studio.
  • Buka tarik-turun "Tipe Ikon" dan pilih "Bilah Tindakan dan Ikon Tab."
  • Pastikan tombol radio "Clip Art" dipilih.
  • Beri tombol "Clip Art" klik.
  • Pilih gambar yang ingin Anda gunakan sebagai pengganti Anda; Saya menggunakan "Tambahkan ke foto."
  • Klik "OK."
  • Buka tarik-turun "Tema", dan pilih "HOLO_LIGHT."
  • Di bidang "Nama,", masukkan "ic_placeholder."
  • Klik "Selanjutnya." Baca informasinya, dan jika Anda senang melanjutkan maka klik "Selesai."

Ikon bilah tindakan: Meluncurkan aplikasi Galeri

Selanjutnya, saya akan membuat item bilah tindakan yang akan meluncurkan galeri pengguna, siap untuk mereka memilih gambar.

Anda menentukan ikon bilah tindakan di dalam file sumber daya menu, yang tinggal di dalam direktori "res / menu". Jika proyek Anda tidak mengandung direktori ini, maka Anda harus membuatnya:

  • Kontrol-klik direktori "res" proyek Anda dan pilih "Baru> Direktori Sumber Daya Android."
  • Buka dropdown "Jenis sumber daya" dan pilih "menu."
  • "Nama direktori" harus diperbarui ke "menu" secara otomatis, tetapi jika tidak maka Anda harus mengubah nama secara manual.
  • Klik "OK."

Anda sekarang siap membuat file sumber daya menu:

  • Kontrol-klik direktori "menu" proyek Anda dan pilih "Baru> file sumber daya menu."
  • Beri nama file ini "my_menu."
  • Klik "OK."
  • Buka file "my_menu.xml", dan tambahkan yang berikut:

// Buat sebuah elemen untuk setiap tindakan //

File menu referensi string "action_gallery", jadi buka file res / values ​​/ strings.xml proyek Anda dan buat sumber ini. Sementara saya di sini, saya juga mendefinisikan string lain yang akan kami gunakan sepanjang proyek ini.

Galeri Aplikasi ini perlu mengakses file di perangkat Anda. Tidak ada teks yang ditemukan

Selanjutnya, gunakan Image Asset Studio untuk membuat ikon "ic_gallery" pada bilah tindakan:

  • Pilih "File> Baru> Aset Gambar."
  • Setel dropdown "Jenis Ikon" ke "Bar Tindakan dan Ikon Tab."
  • Klik tombol "Clip Art".
  • Pilih yang dapat digambar; Saya menggunakan "gambar."
  • Klik "OK."
  • Untuk memastikan ikon ini terlihat jelas di bilah tindakan, buka tarik-turun "Tema" dan pilih "HOLO_DARK."
  • Beri nama ikon ini "ic_gallery."
  • "Klik" Next, "diikuti oleh" Finish. "

Menangani permintaan izin dan mengklik acara

Saya akan melakukan semua tugas yang tidak terkait langsung dengan Text Recognition API di kelas BaseActivity yang terpisah, termasuk membuat instance menu, menangani peristiwa klik bilah tindakan, dan meminta akses ke penyimpanan perangkat.

  • Pilih "File> Baru> kelas Java" dari bilah alat Android Studio.
  • Beri nama kelas ini "BaseActivity."
  • Klik "OK."
  • Buka BaseActivity, dan tambahkan yang berikut:

impor android.app.Aktivitas; impor android.support.v4.app.ActivityCompat; impor android.support.v7.app.ActionBar; impor android.support.v7.app.AlertDialog; impor android.support.v7.app.AppCompatActivity; impor android.os.Bundle; impor android.content.DialogInterface; impor android.content.Intent; impor android.Manifest; impor android.provider.MediaStore; impor android.view.Menu; impor android.view.MenuItem; impor android.content.pm.PackageManager; impor android.net.Uri; impor android.provider. Pengaturan; impor android.support.annotation.NonNull; impor android.support.annotation.Nullable; import java.io.File; BaseActivity kelas publik memperluas AppCompatActivity {public int static final WRITE_STORAGE = 100; SELECT_PHOTO int akhir statis publik = 102; public String akhir statis ACTION_BAR_TITLE = "action_bar_title"; foto File publik; @Override void onCreate yang dilindungi (@Nullable Bundle SavedInstanceState) {super.onCreate (SavedInstanceState); ActionBar actionBar = getSupportActionBar (); if (actionBar! = null) {actionBar.setDisplayHomeAsUpEnabled (true); actionBar.setTitle (getIntent (). getStringExtra (ACTION_BAR_TITLE)); }} @Override boolean publik onCreateOptionsMenu (Menu menu) {getMenuInflater (). Mengembang (R.menu.my_menu, menu); kembali benar; } @Override public boolean onOptionsItemSelected (item MenuItem) {switch (item.getItemId ()) {// Jika "gallery_action" dipilih, maka ... // case R.id.gallery_action: //...check kita sudah izin WRITE_STORAGE // checkPermission (WRITE_STORAGE); istirahat; } kembalikan super.onOptionsItemSelected (item); } @Override public void onRequestPermissionsResult (int requestCode, izin @NonNull String, @NonNull int grantResults) {super.onRequestPermissionsResult (requestCode, permissions, grantResults); switch (requestCode) {case WRITE_STORAGE: // Jika permintaan izin dikabulkan, maka ... // if (grantResults.length> 0 && grantResults == PackageManager.PERMISSION_GRANTED) {//...call selectPicture // selectPicture ( ); // Jika permintaan izin ditolak, maka ... //} else {//...display string "permit_request" // requestPermission (this, requestCode, R.string.permission_request); } istirahat; }} // Tampilkan dialog permintaan izin // public static void requestPermission (Aktivitas aktivitas akhir, final int requestCode, int msg) {AlertDialog.Builder alert = new AlertDialog.Builder (aktivitas); alert.set (msg); alert.setPositiveButton (android.R.string.ok, DialogInterface.OnClickListener baru () {@Override public void onClick (DialogInterface dialogInterface, int i) {dialogInterface.dismiss (); Intent permissonIntent = Intent baru (Pengaturan.ACTION_APPLING_TENTING_TENTING_TENTING_TENTING] .setData (Uri.parse ("paket:" + activity.getPackageName ())); activity.startActivityForResult (permissonIntent, requestCode);}}); alert.setNegativeButton (android.R.string.cancel, DialogInterface.OnClickListener baru () {@Override public void onClick (DialogInterface dialogInterface, int i) {dialogInterface.dismiss ();}}); alert.setCancelable (false); alert.show (); } // Periksa apakah pengguna telah memberikan izin WRITE_STORAGE // public void checkPermission (int requestCode) {switch (requestCode) {case WRITE_STORAGE: int hasWriteExternalStoragePermission = ActivityCompat.checkSelfPermission (ini, Manifest.permission.WRITE_EXTERNAL_STORAGE); // Jika kita memiliki akses ke penyimpanan eksternal ... // if (hasWriteExternalStoragePermission == PackageManager.PERMISSION_GRANTED) {//...call selectPicture, yang meluncurkan Activity di mana pengguna dapat memilih gambar // selectPicture (); // Jika izin belum diberikan, maka ... //} lain {//...minta izin // ActivityCompat.requestPermissions (ini, String baru {Manifest.permission.WRITE_EXTERNAL_STORAGE}, requestCode); } istirahat; }} private void selectPicture () {photo = MyHelper.createTempFile (foto); Intent intent = Intent baru (Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); // Mulai Aktivitas di mana pengguna dapat memilih gambar // startActivityForResult (maksud, SELECT_PHOTO); }}

Pada titik ini, proyek Anda harus mengeluh bahwa itu tidak dapat menyelesaikan MyHelper.createTempFile. Mari kita terapkan ini sekarang!

Mengubah ukuran gambar dengan createTempFile

Buat kelas "MyHelper" baru. Di kelas ini, kami akan mengubah ukuran gambar yang dipilih pengguna, siap untuk diproses oleh Text Recognition API.

impor android.graphics.Bitmap; impor android.graphics.BitmapFactory; impor android.content.Context; impor android.database.Cursor; impor android.os.Environment; impor android.widget.ImageView; impor android.provider.MediaStore; impor android.net.Uri; impor android.graphics.BitmapFactory.decodeFile statis; impor android.graphics.BitmapFactory.decodeStream statis; import java.io.File; impor java.io.FileNotFoundException; import java.io.FileOutputStream; impor java.io.IOException; kelas publik MyHelper {public static String getPath (Konteks konteks, Uri uri) {String path = ""; Proyeksi string = {MediaStore.Images.Media.DATA}; Kursor kursor = context.getContentResolver (). Kueri (uri, proyeksi, 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 (); } jalur pengembalian; } public static File createTempFile (File file) {Direktori file = File baru (Environment.getExternalStorageDirectory (). getPath () + "/com.jessicathornsby.myapplication"); if (! directory.exists () ||! directory.isDirectory ()) {directory.mkdirs (); } if (file == null) {file = File baru (direktori, "orig.jpg"); } mengembalikan file; } public static Bitmap resizePhoto (File imageFile, Konteks konteks, Gambar, tampilan ImageView) {BitmapFactory.Options newOptions = new BitmapFactory.Options (); coba {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 ()); mengembalikan compressPhoto (imageFile, BitmapFactory.decodeStream (context.getContentResolver (). openInputStream (uri), null, newOptions)); } catch (pengecualian FileNotFoundException) {exception.printStackTrace (); kembali nol; }} public static Bitmap resizePhoto (File imageFile, String path, ImageView view) {Pilihan BitmapFactory.Options = BitmapFactory.Options baru (); decodeFile (jalur, opsi); int photoHeight = options.outHeight; int photoWidth = options.outWidth; options.inSampleSize = Math.min (photoWidth / view.getWidth (), photoHeight / view.getHeight ()); mengembalikan compressPhoto (imageFile, BitmapFactory.decodeFile (path, options)); } privatePetaPmap statis statis (File photoFile, bitmap bitmap) {coba {FileOutputStream fOutput = FileOutputStream baru (photoFile); bitmap.compress (Bitmap.CompressFormat.JPEG, 70, fOutput); fOutput.close (); } catch (pengecualian IOException) {exception.printStackTrace (); } mengembalikan bitmap; }}

Setel gambar ke ImageView

Selanjutnya, kita perlu mengimplementasikan onActivityResult () di kelas MainActivity kami, dan mengatur gambar yang dipilih pengguna ke ImageView kami.

impor android.graphics.Bitmap; impor android.os.Bundle; impor android.widget.ImageView; impor android.content.Intent; impor android.widget.TextView; impor android.net.Uri; MainActivity kelas publik memperluas BaseActivity {private Bitmap myBitmap; pribadi ImageView myImageView; private TextView myTextView; @Override void onCreate yang dilindungi (Bundle saverInstanceState) {super.onCreate (saverInstanceState); setContentView (R.layout.activity_main); myTextView = findViewById (R.id.textView); myImageView = findViewById (R.id.imageView); } @Override void yang dilindungi onActivityResult (int requestCode, int resultCode, Intent data) {super.onActivityResult (requestCode, resultCode, data); if (resultCode == RESULT_OK) {switch (requestCode) {case WRITE_STORAGE: checkPermission (requestCode); istirahat; huruf SELECT_PHOTO: Uri dataUri = data.getData (); String path = MyHelper.getPath (ini, dataUri); if (path == null) {myBitmap = MyHelper.resizePhoto (foto, ini, dataUri, myImageView); } else {myBitmap = MyHelper.resizePhoto (foto, jalur, myImageView); } if (myBitmap! = null) {myTextView.setText (null); myImageView.setImageBitmap (myBitmap); } istirahat; }}}}

Jalankan proyek ini pada perangkat Android fisik atau AVD, dan beri ikon bilah tindakan klik. Saat diminta, berikan izin WRITE_STORAGE dan pilih gambar dari galeri; gambar ini sekarang harus ditampilkan di UI aplikasi Anda.

Sekarang kami telah meletakkan dasar, kami siap untuk mulai mengekstraksi beberapa teks!

Mengajar aplikasi untuk mengenali teks

Saya ingin memicu pengenalan teks sebagai respons terhadap peristiwa klik, jadi kami perlu menerapkan OnClickListener:

impor android.graphics.Bitmap; impor android.os.Bundle; impor android.widget.ImageView; impor android.content.Intent; impor android.widget.TextView; impor android.view.View; impor android.net.Uri; MainActivity kelas publik memperluas BaseActivity mengimplementasikan View.OnClickListener {private Bitmap myBitmap; pribadi ImageView myImageView; private TextView myTextView; @Override void onCreate yang dilindungi (Bundle saverInstanceState) {super.onCreate (saverInstanceState); 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 (Tampilan tampilan) {switch (view.getId ()) {case R.id.checkText: if (myBitmap! = Null) {// Kami akan mengimplementasikan runTextRecog pada langkah berikutnya // runTextRecog (); } istirahat; }}

Kit ML hanya dapat memproses gambar ketika mereka berada dalam format FirebaseVisionImage, jadi kita perlu mengubah gambar kita menjadi objek FirebaseVisionImage. Anda bisa membuat FirebaseVisionImage dari Bitmap, media.Image, ByteBuffer, atau array byte. Karena kami bekerja dengan Bitmap, kami perlu memanggil metode utilitas fromBitmap () dari kelas FirebaseVisionImage, dan meneruskannya dengan Bitmap kami.

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

ML Kit memiliki kelas detektor yang berbeda untuk setiap operasi pengenalan gambarnya. Untuk teks, kita perlu menggunakan kelas FirebaseVisionTextDetector, yang melakukan pengenalan karakter optik (OCR) pada gambar.

Kami membuat instance FirebaseVisionTextDetector, menggunakan getVisionTextDetector:

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

Selanjutnya, kita perlu memeriksa teks FirebaseVisionImage, dengan memanggil metode detectInImage () dan mengirimkannya objek FirebaseVisionImage. Kita juga perlu menerapkan panggilan balik onSuccess dan onFailure, ditambah pendengar yang sesuai sehingga aplikasi kami mendapat pemberitahuan setiap kali hasilnya tersedia.

detector.detectInImage (image) .addOnSuccessListener (OnSuccessListener baru)() {@Override // Untuk melakukan //}}). AddOnFailureListener (OnFailureListener baru () {@Override public void onFailure (Pengecualian @NonNull pengecualian) {// Tugas gagal dengan pengecualian //}}); }

Jika operasi ini gagal, maka saya akan menampilkan bersulang, tetapi jika operasi ini berhasil maka saya akan memanggil prosesExtractedText dengan tanggapan.

Pada titik ini, kode deteksi teks saya terlihat seperti ini:

// Buat FirebaseVisionImage // private void runTextRecog () {FirebaseVisionImage image = FirebaseVisionImage.fromBitmap (myBitmap); // Buat instance FirebaseVisionCloudTextDetector // FirebaseVisionTextDetector detector = FirebaseVision.getInstance (). GetVisionTextDetector (); // Daftarkan OnSuccessListener // detector.detectInImage (image) .addOnSuccessListener (OnSuccessListener baru)() {@Override // Terapkan onSuccess callback // public void onSuccess (FirebaseVisionText teks) {// Call processExtractedText dengan respons // processExtractedText (teks); }}). addOnFailureListener (OnFailureListener baru () {@Override // Terapkan onFailure calback // public void onFailure (Pengecualian @NonNull pengecualian) {Toast.makeText (MainActivity.this, "Exception", Toast.LENGTH_LONG) .show ( );}}); }

Setiap kali aplikasi kami menerima notifikasi onSuccess, kami perlu menguraikan hasilnya.

Objek FirebaseVisionText dapat berisi elemen, garis, dan blok, di mana setiap blok biasanya sama dengan satu paragraf teks. Jika FirebaseVisionText mengembalikan 0 blok, maka kami akan menampilkan string "no_text", tetapi jika itu berisi satu blok atau lebih maka kami akan menampilkan teks yang diambil sebagai bagian dari TextView kami.

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

Ini kode MainActivity yang sudah lengkap:

impor android.graphics.Bitmap; impor android.os.Bundle; impor android.widget.ImageView; impor android.content.Intent; impor android.widget.TextView; impor android.widget.Toast; impor android.view.View; impor android.net.Uri; impor 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 publik memperluas BaseActivity mengimplementasikan View.OnClickListener {private Bitmap myBitmap; pribadi ImageView myImageView; private TextView myTextView; @Override void onCreate yang dilindungi (Bundle saverInstanceState) {super.onCreate (saverInstanceState); 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 (Tampilan tampilan) {switch (view.getId ()) {case R.id.checkText: if (myBitmap! = Null) {runTextRecog (); } istirahat; }} @Override void yang dilindungi onActivityResult (int requestCode, int resultCode, Intent data) {super.onActivityResult (requestCode, resultCode, data); if (resultCode == RESULT_OK) {switch (requestCode) {case WRITE_STORAGE: checkPermission (requestCode); istirahat; huruf SELECT_PHOTO: Uri dataUri = data.getData (); String path = MyHelper.getPath (ini, dataUri); if (path == null) {myBitmap = MyHelper.resizePhoto (foto, ini, dataUri, myImageView); } else {myBitmap = MyHelper.resizePhoto (foto, jalur, myImageView); } if (myBitmap! = null) {myTextView.setText (null); myImageView.setImageBitmap (myBitmap); } istirahat; }}} private void runTextRecog () {FirebaseVisionImage image = FirebaseVisionImage.fromBitmap (myBitmap); FirebaseVisionTextDetector detector = FirebaseVision.getInstance (). GetVisionTextDetector (); detector.detectInImage (image) .addOnSuccessListener (OnSuccessListener baru)() {@Override public void onSuccess (teks FirebaseVisionText) {processExtractedText (teks); }}). addOnFailureListener (OnFailureListener baru () {@Override public void onFailure (Pengecualian @NonNull pengecualian) {Toast.makeText (MainActivity.this, "Exception", Toast.LENGTH_LONG) .show ();}}); } private void processExtractedText (FirebaseVisionText firebaseVisionText) {myTextView.setText (null); if (firebaseVisionText.getBlocks (). size () == 0) {myTextView.setText (R.string.no_text); kembali; } untuk (FirebaseVisionText.Blok blok: firebaseVisionText.getBlocks ()) {myTextView.append (block.getText ()); }}}

Menguji proyek

Sekarang saatnya untuk melihat Pengenalan Teks Kit ML dalam aksi! Instal proyek ini pada perangkat Android atau AVD, pilih gambar dari galeri, dan kemudian tekan tombol "Periksa teks". Aplikasi harus merespons dengan mengekstraksi semua teks dari gambar, dan kemudian menampilkannya di TextView.

Perhatikan bahwa tergantung pada ukuran gambar Anda, dan jumlah teks yang dikandungnya, Anda mungkin perlu menggulir untuk melihat semua teks yang diekstraksi.

Anda juga dapat mengunduh proyek yang sudah selesai dari GitHub.

Membungkus

Anda sekarang tahu cara mendeteksi dan mengekstrak teks dari gambar, menggunakan ML Kit.

API Pengenalan Teks hanyalah salah satu bagian dari Kit ML. SDK ini juga menawarkan pemindaian barcode, deteksi wajah, pelabelan gambar, dan pengenalan tengara, dengan rencana untuk menambahkan lebih banyak API untuk kasus penggunaan seluler yang umum, termasuk Balas Cerdas dan API kontur wajah kepadatan tinggi.

API Kit ML mana yang paling menarik untuk Anda coba? Beri tahu kami di komentar di bawah!

amung dilaporkan edang dalam pembicaraan dengan Apple untuk memaok yang terakhir dengan diplay OLED. Menurut Elec, Apple akan menampilkan fitur dalam MacBook Pro 16-inci dikabarkan dan iPad Pro model ...

Acara per amung CE 2019 memiliki ejumlah pengumuman bear dari peruahaan, tetapi mungkin yang paling mengejutkan adalah pengungkapan bahwa aiten digital Bixby yang tumbuh di rumah akan egera dapat meng...

Artikel Yang Menarik