Google’ın Machine Learning SDK'sındaki resimlerden metin nasıl çıkarılır?

Yazar: John Stephens
Yaratılış Tarihi: 27 Ocak Ayı 2021
Güncelleme Tarihi: 5 Temmuz 2024
Anonim
Google’ın Machine Learning SDK'sındaki resimlerden metin nasıl çıkarılır? - Uygulamaların
Google’ın Machine Learning SDK'sındaki resimlerden metin nasıl çıkarılır? - Uygulamaların

İçerik


Ayrıca Metin Tanıma API'sını çeviri uygulamaları için temel olarak ya da kullanıcının kameralarını uğraştığı herhangi bir metne yönlendirebileceği ve onlara sesli bir şekilde okuyabilmesi için erişilebilirlik hizmetleri olarak kullanabilirsiniz.

Bu eğiticide, kullanıcının galerisindeki herhangi bir görüntüden metin çıkarabilecek bir uygulama oluşturarak çok çeşitli yenilikçi özelliklerin temelini oluşturacağız. Bu eğitici yazıda ele almamıza rağmen, bu uygulamayı cihazın kamerasına bağlayarak, kullanıcının çevresinden gerçek zamanlı olarak metin de yakalayabilirsiniz.

Cihazda mı yoksa bulutta mı?

Bazı ML Kit API'leri yalnızca cihazda mevcuttur, ancak bir kısmı cihazda ve Metin Tanıma API'sı dahil bulutta kullanılabilir.

Bulut tabanlı Metin API, daha geniş bir dil ve karakter aralığını tanımlayabilir ve aygıttaki karşıtından daha fazla doğruluk vaat eder. Ancak, o yapar aktif bir İnternet bağlantısı gerektirir ve yalnızca Blaze seviyesindeki projeler için kullanılabilir.


Bu makalede, Metin Tanıma API'sini yerel olarak çalıştırıyoruz, böylece Blaze’ye yükseltme yapıp yapmadığınızdan veya ücretsiz Firebase Spark planından bağımsız olarak devam edebilirsiniz.

ML Kit ile bir metin tanıma uygulaması oluşturma

İstediğiniz ayarlarla bir uygulama oluşturun, ancak istendiğinde “Boş Etkinlik” şablonunu seçin.

ML Kit SDK, Firebase'in bir parçasıdır, bu nedenle SHA-1 imza sertifikasını kullanarak projenizi Firebase'e bağlamanız gerekir. Projenizin SHA-1'ini almak için:

  • Android Studio’nun “Gradle” sekmesini seçin.
  • “Gradle projeleri” panelinde, projenizin “kökünü” genişletmek için çift tıklayın ve ardından “Görevler> Android> İmzalama Raporu” nu seçin.
  • Android Studio penceresinin altındaki panel, SHA-1 imza sertifikası da dahil olmak üzere, bu proje hakkında bazı bilgileri görüntülemek için güncellenmelidir.


Projenizi Firebase'e bağlamak için:

  • Web tarayıcınızda, Firebase Konsolu'nu başlatın.
  • “Proje ekle” yi seçin.
  • Projenize bir ad verin; “ML Test” kullanıyorum.
  • Hüküm ve koşulları okuyun ve devam etmekten memnuniyet duyarsanız “Kabul ediyorum…” ve ardından “Proje oluştur” u seçin.
  • "Android uygulamanıza Firebase Ekle" yi seçin.
  • Projenize, MainActivity dosyasının en üstünde ve Manifest'in içinde bulacağınız paket adını girin.
  • Projenizin SHA-1 imzalama sertifikasını girin.
  • “Uygulamayı kaydet” i tıklayın.
  • “Google-services.json'u indirin.” Seçeneğini seçin. Bu dosya, API anahtarı dahil olmak üzere projeniz için gerekli tüm Firebase meta verilerini içerir.
  • Android Studio'da, google-services.json dosyasını sürükleyip projenizin “app” dizinine bırakın.

  • Proje düzeyinde build.gradle dosyanızı açın ve Google hizmetleri sınıf yolunu ekleyin:

classpath com.google.gms: google hizmetleri: 4.0.1

  • Uygulama düzeyinde build.gradle dosyanızı açın ve Firebase Core, Firebase ML Vision ve model yorumlayıcısı ve Google hizmetleri eklentisine bağımlılıklar ekleyin:

uygulama eklentisi: com.google.gms.google-services ... ... ... bağımlılıklar {application fileTree (dir: libs, dahil:) uygulama com.google.firebase: firebase-core: 16.0.1 uygulama com. google.firebase: firebase-ml-vision: 16.0.0 uygulama com.google.firebase: firebase-ml-model yorumlayıcı: 16.0.0

Bu noktada, projenizi Firebase sunucularına bağlanabilmesi için çalıştırmanız gerekir:

  • Uygulamanızı fiziksel bir Android akıllı telefona veya tablete veya bir Android Sanal Aygıtına (AVD) yükleyin.
  • Firebase Konsolunda, “Kurulumu doğrulamak için uygulamayı çalıştır” seçeneğini seçin.
  • Birkaç dakika sonra bir “Tebrikler” görmelisiniz; “Konsola devam et” seçeneğini seçin.

Google’ın önceden eğitilmiş makine öğrenme modellerini indirin

Varsayılan olarak, ML Kiti yalnızca gerektiğinde ve ne zaman modelleri indirir, bu nedenle kullanıcı ilk kez metin çıkarmayı denediğinde OCR modelini indirir.

Bunun potansiyel olarak kullanıcı deneyimi üzerinde olumsuz bir etkisi olabilir - bir özelliğe erişmeye çalışacağınızı hayal edin, yalnızca uygulamanın bu özelliği sunmadan önce daha fazla kaynak indirmesi gerektiğini keşfedebilirsiniz. En kötü senaryoda, uygulamanız, ihtiyaç duyduğu kaynakları, örneğin cihazda İnternet bağlantısı yoksa, örneğin ihtiyaç duyduğu kaynakları indiremeyebilir.

Bunun bizim uygulamamızda olmadığından emin olmak için, kurulum sırasında gerekli OCR modelini indireceğim, bu da Manest'te bazı değişiklikler gerektirir.

Manifest'i açık tutarken, daha sonra bu eğitimde kullanacağımız WRITE_EXTERNAL_STORAGE iznini de ekleyeceğim.

// WRITE_EXTERNAL_STORAGE iznini ekleyin // // Aşağıdakileri ekleyin //

Düzenin oluşturulması

Kolay şeyleri yoldan çıkaralım ve aşağıdakilerden oluşan bir düzen oluşturalım:

  • Bir ImageView. Başlangıçta, bu bir yer tutucuyu görüntüleyecek, ancak kullanıcı galerisinden bir resim seçtiğinde güncellenecektir.
  • Metin çıkarımını tetikleyen bir Düğme.
  • Çıkarılan metni görüntüleyeceğimiz bir TextView.
  • Bir ScrollView. Çıkarılan metnin ekrana tam olarak sığacağı konusunda hiçbir garanti olmadığından, TextView'ı bir ScrollView içine yerleştireceğim.

İşte bitmiş activity_main.xml dosyası:

Bu düzen, çizilebilir bir "ic_placeholder" a başvuruyor, şimdi bunu oluşturalım:

  • Android Studio araç çubuğundan “Dosya> Yeni> Görüntü Varlığı” seçeneğini seçin.
  • “Simge Türü” açılır penceresini açın ve “Eylem Çubuğu ve Sekme Simgeleri” ni seçin.
  • “Küçük Resim” radyo düğmesinin seçili olduğundan emin olun.
  • “Küçük Resim” düğmesine bir kez tıklayın.
  • Yer tutucu olarak kullanmak istediğiniz resmi seçin; “Fotoğraflara ekle” yi kullanıyorum.
  • “Tamam” ı tıklayın.
  • “Tema” açılır penceresini açın ve “HOLO_LIGHT” öğesini seçin.
  • “Ad” alanına “ic_placeholder” girin.
  • “İleri” düğmesini tıklayın. Bilgileri okuyun ve devam etmekten memnunsanız, “Son” düğmesini tıklayın.

Eylem çubuğu simgeleri: Galeri uygulamasını başlatma

Daha sonra, kullanıcının galerisini başlatacak, resim seçmeleri için hazır bir eylem çubuğu öğesi oluşturacağım.

“Res / menu” dizininde bulunan bir menü kaynak dosyasının içindeki eylem çubuğu simgelerini tanımlarsınız. Projeniz bu dizini içermiyorsa, oluşturmanız gerekir:

  • Projenizin “res” dizinini kontrol tuşunu tıklayın ve “Yeni> Android Kaynak Dizini” ni seçin.
  • “Kaynak türü” açılır penceresini açın ve “menü” seçeneğini seçin.
  • “Dizin adı” otomatik olarak “menü” ye güncellenmelidir, ancak değilse, el ile yeniden adlandırmanız gerekir.
  • “Tamam” ı tıklayın.

Artık menü kaynak dosyasını oluşturmaya hazırsınız:

  • Projenizin “menü” dizinini kontrol tuşunu tıklayın ve “Yeni> Menü kaynak dosyası” nı seçin.
  • Bu dosyayı “my_menu” olarak adlandırın.
  • “Tamam” ı tıklayın.
  • “My_menu.xml” dosyasını açın ve aşağıdakileri ekleyin:

//Oluşturduğunuz bir her eylem için eleman //

Menü dosyası bir “action_gallery” dizgisine başvuruyor, bu nedenle projenizin res / value / strings.xml dosyasını açın ve bu kaynağı oluşturun. Ben buradayken, bu proje boyunca kullanacağımız diğer dizgileri de tanımlıyorum.

galeri Bu uygulama cihazınızdaki dosyalara erişmeniz gerekir. Metin bulunamadı

Ardından, eylem çubuğunun “ic_gallery” simgesini oluşturmak için Image Asset Studio'yu kullanın:

  • “Dosya> Yeni> Görüntü Varlığı” nı seçin.
  • “Simge Türü” açılır menüsünü “Eylem Çubuğu ve Sekme Simgeleri” olarak ayarlayın.
  • “Küçük Resim” düğmesine tıklayın.
  • Bir çekilebilir seçin; “İmaj” kullanıyorum.
  • “Tamam” ı tıklayın.
  • Bu simgenin işlem çubuğunda açıkça göründüğünden emin olmak için, “Tema” açılır penceresini açın ve “HOLO_DARK” ı seçin.
  • Bu simgeyi “ic_gallery” olarak adlandırın.
  • “Next” i ve ardından “Finish” i tıklayın.

İzin isteklerini ve tıklama etkinliklerini işleme

Menü tanıma, eylem çubuğu tıklatma olaylarını işleme ve cihazın depolama alanına erişmeyi isteme dahil olmak üzere, Metin Tanıma API'si ile doğrudan ilgili olmayan tüm görevleri ayrı bir BaseActivity sınıfında gerçekleştireceğim.

  • Android Studio’nun araç çubuğundan “Dosya> Yeni> Java sınıfı” öğesini seçin.
  • Bu sınıfa “BaseActivity” adı verin.
  • “Tamam” ı tıklayın.
  • BaseActivity'yi açın ve aşağıdakileri ekleyin:

android.app.Activity içeri aktar; android.support.v4.app.ActivityCompat dosyasını içe aktarın; android.support.v7.app.ActionBar dosyasını içe aktarın; android.support.v7.app.AlertDialog dosyasını içe aktarın; android.support.v7.app.AppCompatActivity içeri aktarma; android.os.Bundle alma; android.content.DialogInterface öğesini içe aktarın; android.content.Intent alma; android içe aktarın. Manifest; android.provider.MediaStore dosyasını içe aktarın; android.view.Menu dosyasını içe aktarın; android.view.MenuItem alma; android.content.pm.PackageManager öğelerini içe aktarın; android.net.Uri'yi içe aktarın; android.provider.Settings alma; android.support.annotation.NonNull dosyasını içe aktarın; android.support.annotation.Nullable dosyasını içe aktarın; java.io.File dosyasını içe aktarın; genel sınıf BaseActivity, AppCompatActivity değerini genişletir {public static final int WRITE_STORAGE = 100; genel statik son int SELECT_PHOTO = 102; genel statik son Dize ACTION_BAR_TITLE = "action_bar_title"; genel Dosya fotoğrafı; @ Override korumalı geçersiz onCreate (@Nullable Bundle savedInstanceState) {super.onCreate (savedInstanceState); ActionBar actionBar = getSupportActionBar (); if (actionBar! = null) {actionBar.setDisplayHomeAsUpEnabled (true); actionBar.setTitle (getIntent () getStringExtra (ACTION_BAR_TITLE).); }} @Oolride public boolean onCreateOptionsMenu (Menü menüsü) {getMenuInflater (). İnflate (R.menu.my_menu, menu); gerçek dönüş; } @Override public boolean onOptionsItemSelected (MenuItem öğesi) {switch (item.getItemId ()) {// “gallery_action” seçilmişse, o zaman ... // case R.id.gallery_action: //...check WRITE_STORAGE izni // checkPermission (WRITE_STORAGE); break; } return super.onOptionsItemSelected (item); } @Override public void onRequestPermissionsResult (int requestCode, @NonNull Dize izinleri, @NonNull int grantResults) {super.onRequestPermissionsResult (requestCode, izinler, grantResults); switch (requestCode) {case WRITE_STORAGE: // İzin talebi verilmişse, o zaman ... // if (grantResults.length> 0 && grantResults == PackageManager.PERMISSION_GRANTED) {//...call selectPicture // selectPicture ( ); // İzin isteği reddedilirse, o zaman ... //} else {//...delite_request dizesini // requestPermission (this, requestCode, R.string.permission_request); } mola; }} // İzin isteği iletişim kutusunu görüntüle // public static void requestPermission (son Etkinlik etkinliği, son int requestCode, int msg) {AlertDialog.Builder alert = new AlertDialog.Builder (activity); alert.set (MSG); alert.setPositiveButton (android.R.string.ok, new DialogInterface.OnClickListener () {@Override public void onClick (DialogInterface dialogInterface, int i) {dialogInterface.dismiss (); .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 (yanlış); alert.show (); } // Kullanıcının WRITE_STORAGE izni verip vermediğini kontrol edin // public void checkPermission (int requestCode) {anahtar (requestCode) {vaka WRITE_STORAGE: int hasWriteExternalStoragePermission = ActivityCompat.checkSelfPermission (this, Manifest.permission.WRITE_EXEXALAL); // Harici depolamaya erişimimiz varsa ... // if (hasWriteExternalStoragePermission == PackageManager.PERMISSION_GRANTED) {//...call selectPicture, kullanıcının bir resim seçebileceği bir Etkinlik başlatır // selectPicture (); // İzin verilmediyse, o zaman ... //} else {//... izni isteyiniz // ActivityCompat.requestPermissions (bu, yeni String {Manifest.permission.WRITE_EXTERNAL_STORAGE}, requestCode); } mola; }} private void selectPicture () {photo = MyHelper.createTempFile (photo); Amaç amacı = yeni Amaç (Amaç: ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); // Kullanıcının bir resim seçebileceği bir Aktivite başlatın // startActivityForResult (intent, SELECT_PHOTO); }}

Bu noktada, projeniz MyHelper.createTempFile'ı çözemediğinden şikayetçi olmalıdır. Şimdi bunu uygulayalım!

CreateTempFile ile görüntüleri yeniden boyutlandırma

Yeni bir “MyHelper” sınıfı oluşturun. Bu sınıfta, kullanıcının Metin Tanıma API'sı tarafından işlenmeye hazır olan seçili resmini yeniden boyutlandıracağız.

android.graphics.Bitmap alma; android.graphics.BitmapFactory dosyasını içe aktarın; android.content.Context dosyasını içe aktarın; android.database.Cursor öğesini içe aktarın; android.os.Environment almak; android.widget.ImageView içeri aktar; android.provider.MediaStore dosyasını içe aktarın; android.net.Uri'yi içe aktarın; statik android.graphics.BitmapFactory.decodeFile alma; statik android.graphics.BitmapFactory.decodeStream öğesini içe aktarın; java.io.File dosyasını içe aktarın; java.io.FileNotFoundException öğesini içe aktarın; java.io.FileOutputStream öğesini içe aktarın; java.io.IOException öğesini içe aktarın; genel sınıf MyHelper {genel statik String getPath (Bağlam bağlamı, Uri uri) {String path = ""; Dize projeksiyonu = {MediaStore.Images.Media.DATA}; İmleç imleç = context.getContentResolver (). Query (uri, projeksiyon, boş, boş, boş); int column_index; if (imleç! = null) {column_index = cursor.getColumnIndexOrThrow (MediaStore.Images.Media.DATA); cursor.moveToFirst (); path = cursor.getString (column_index); ) (Cursor.close; } dönüş yolu; } public static Dosya createTempFile (Dosya dosyası) {Dosya dizini = yeni Dosya (Environment.getExternalStorageDirectory (). getPath () + "/com.jessicathornsby.myapplication"); if (! directory.exists () ||! directory.isDirectory ()) {directory.mkdirs (); } if (file == null) {file = new Dosya (dizin, "orig.jpg"); } dönüş dosyası; } public static Bitmap resizePhoto (Dosya imageFile, İçerik bağlamı, Uri uri, ImageView görünümü) {BitmapFactory.Options newOptions = new BitmapFactory.Options (); deneyin {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 ()); Döndürmek sıkıştırmakPhoto (imageFile, BitmapFactory.decodeStream (context.getContentResolver (). openInputStream (uri), null, newOptions)); } catch (FileNotFoundException istisna) {exception.printStackTrace (); null döndür; }} public static Bitmap resizePhoto (Dosya imageFile, Dize yolu, ImageView görünümü) {BitmapFactory.Options options = new BitmapFactory.Options (); decodeFile (yol, seçenekler); int photoHeight = options.outHeight; int photoWidth = options.outWidth; options.inSampleSize = Math.min (photoWidth / view.getWidth (), photoHeight / view.getHeight ()); Döndürmek sıkıştırmakPhoto (imageFile, BitmapFactory.decodeFile (path, options)); } özel statik Bitmap compressPhoto (Dosya photoFile, Bitmap bitmap) {try {FileOutputStream fOutput = yeni FileOutputStream (photoFile); bitmap.compress (Bitmap.CompressFormat.JPEG, 70, fOutput); fOutput.close (); } catch (IOException istisnası) {exception.printStackTrace (); } return bitmap; }}

Görüntüyü ImageView'e ayarlama

Daha sonra, MainActivity sınıfımıza onActivityResult () öğesini uygulamamız ve kullanıcının seçtiği resmi ImageView olarak ayarlamamız gerekir.

android.graphics.Bitmap alma; android.os.Bundle alma; android.widget.ImageView içeri aktar; android.content.Intent alma; android.widget.TextView öğesini içe aktarın; android.net.Uri'yi içe aktarın; genel sınıf MainActivity, BaseActivity'yi genişletiyor {private Bitmap myBitmap; özel ImageView myImageView; özel TextView myTextView; @ Override korumalı geçersiz onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); myTextView = findViewById (R.id.textView); myImageView = findViewById (R.id.imageView); } @Override korumalı geçersiz onActivityResult (int requestCode, int resultCode, Intent verileri) {super.onActivityResult (requestCode, resultCode, data); if (resultCode == RESULT_OK) {anahtar (requestCode) {vaka WRITE_STORAGE: checkPermission (requestCode); break; case SELECT_PHOTO: Uri dataUri = data.getData (); Dize yolu = MyHelper.getPath (this, dataUri); if (path == null) {myBitmap = MyHelper.resizePhoto (fotoğraf, bu, dataUri, myImageView); } else {myBitmap = MyHelper.resizePhoto (fotoğraf, yol, myImageView); } if (myBitmap! = null) {myTextView.setText (null); myImageView.setImageBitmap (myBitmap); } mola; }}}}

Bu projeyi fiziksel bir Android cihazda veya AVD'de çalıştırın ve eylem çubuğu simgesine bir tıklama verin. İstendiğinde, WRITE_STORAGE iznini verin ve galeriden bir resim seçin; bu görüntünün şimdi uygulamanızın kullanıcı arayüzünde gösterilmesi gerekir.

Şimdi temelleri attık, bazı metinleri çıkarmaya hazırız!

Metni tanımak için uygulama öğretmek

Bir click olayına yanıt olarak metin tanımayı tetiklemek istiyorum, bu yüzden bir OnClickListener uygulamamız gerekiyor:

android.graphics.Bitmap alma; android.os.Bundle alma; android.widget.ImageView içeri aktar; android.content.Intent alma; android.widget.TextView öğesini içe aktarın; android.view.View içeri aktar; android.net.Uri'yi içe aktarın; genel sınıf MainActivity, BaseActivity'yi genişletir View.OnClickListener {private Bitmap myBitmap; özel ImageView myImageView; özel TextView myTextView; @ Override korumalı geçersiz 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 (bu); } @Override public void onClick (Görünüm görünümü) {switch (view.getId ()) {case R.id.checkText: if (myBitmap! = Null) {// Bir sonraki adımda runTextRecog uygulayacağız // runTextRecog (); } mola; }}

ML Kit, görüntüleri yalnızca FirebaseVisionImage biçimindeyken işleyebilir, bu nedenle resmimizi bir FirebaseVisionImage nesnesine dönüştürmemiz gerekir. Bir Bitmap'ten, media.Image, ByteBuffer veya bir bayt dizisinden bir FirebaseVisionImage oluşturabilirsiniz. Bitmaplerle çalıştığımızdan, FirebaseVisionImage sınıfının fromBitmap () yardımcı programını çağırmalı ve onu Bitmap'imizden geçirmeliyiz.

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

ML Kit, görüntü tanıma işlemlerinin her biri için farklı dedektör sınıflarına sahiptir. Metin için, bir görüntü üzerinde optik karakter tanıma (OCR) yapan FirebaseVisionTextDetector sınıfını kullanmamız gerekiyor.

GetVisionTextDetector öğesini kullanarak bir FirebaseVisionTextDetector örneği oluşturuyoruz:

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

Daha sonra, FirInIngelge () yöntemini çağırarak ve FirinaseVisionImage nesnesini ileterek FirebaseVisionImage'ın metin olup olmadığını kontrol etmemiz gerekir. Ayrıca onSuccess ve onFailure geri aramaları ve buna karşılık gelen dinleyicileri de uygulamamız gerekiyor, böylece ne zaman sonuç elde edilse uygulamamıza bildiriliyoruz.

detector.detectInImage (image) .addOnSuccessListener (yeni OnSuccessListener)() {@Override // Yapılacak //}}). AddOnFailureListener (new OnFailureListener () {@Override public void onFailure (@NonNull İstisna istisnası) {// Bir istisna dışında görev başarısız oldu}); }

Bu işlem başarısız olursa, bir tost göstereceğim, ancak işlem başarılıysa, yanıtla processExtractedText'i çağıracağım.

Bu noktada, metin algılama kodum şöyle görünür:

// Bir FirebaseVisionImage oluşturun // private void runTextRecog () {FirebaseVisionImage image = FirebaseVisionImage.fromBitmap (myBitmap); // FirebaseVisionCloudTextDetector örneğini oluşturun // FirebaseVisionTextDetector detector = FirebaseVision.getInstance (). GetVisionTextDetector (); // Bir OnSuccessListener kaydedin // detector.detectInImage (image) .addOnSuccessListener (yeni OnSuccessListener)() {@Override // onSuccess geri aramasını uygulayın // public void onSuccess (FirebaseVisionText metinleri) {// Call processExtractedText yanıtıyla // processExtractedText (texts); }}). addOnFailureListener (new OnFailureListener () {@Override // onFailure calback // public void onFailure (@NonNull İstisna istisnası) uygulayın {Toast.makeText (MainActivity.this, "Exception", Toast.makeText (MainActivity.this, "Exception", Toast.LENGTH_LONG). );}}); }

Uygulamamız bir onSuccess bildirimi aldığında, sonuçları ayrıştırmamız gerekir.

Bir FirebaseVisionText nesnesi, her bir bloğun genellikle tek bir metin paragrafına eşit olduğu öğeleri, satırları ve blokları içerebilir. FirebaseVisionText 0 blok döndürürse, “no_text” dizesini görüntüleriz, ancak bir veya daha fazla blok içeriyorsa, alınan metni TextView'ımızın bir parçası olarak görüntüleriz.

private void processExtractedText (FirebaseVisionText firebaseVisionText) {myTextView.setText (null); if (firebaseVisionText.getBlocks (). size () == 0) {myTextView.setText (R.string.no_text); dönüş; } (FirebaseVisionText.Block bloğu: firebaseVisionText.getBlocks ()) {myTextView.append (block.getText ()); }}}

İşte tamamlanan MainActivity kodu:

android.graphics.Bitmap alma; android.os.Bundle alma; android.widget.ImageView içeri aktar; android.content.Intent alma; android.widget.TextView öğesini içe aktarın; android.widget.Toast dosyasını içe aktarın; android.view.View içeri aktar; android.net.Uri'yi içe aktarın; android.support.annotation.NonNull dosyasını içe aktarın; com.google.firebase.ml.vision.common.FirebaseVisionImage 'ı içe aktarın; com.google.firebase.ml.vision.text.FirebaseVisionText dosyasını içe aktarın; com.google.firebase.ml.vision.text.FirebaseVisionTextDetector dosyasını içe aktarın; com.google.firebase.ml.vision.FirebaseVision uygulamasını içe aktarın; com.google.android.gms.tasks.OnSuccessListener öğesini içe aktarın; com.google.android.gms.tasks.OnFailureListener öğesini içe aktarın; genel sınıf MainActivity, BaseActivity'yi genişletir View.OnClickListener {private Bitmap myBitmap; özel ImageView myImageView; özel TextView myTextView; @ Override korumalı geçersiz 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 (bu); } @Override public void onClick (Görünüm görünümü) {switch (view.getId ()) {case R.id.checkText: if (myBitmap! = Null) {runTextRecog (); } mola; }} @Override korumalı geçersiz onActivityResult (int requestCode, int resultCode, Intent verileri) {super.onActivityResult (requestCode, resultCode, data); if (resultCode == RESULT_OK) {anahtar (requestCode) {vaka WRITE_STORAGE: checkPermission (requestCode); break; case SELECT_PHOTO: Uri dataUri = data.getData (); Dize yolu = MyHelper.getPath (this, dataUri); if (path == null) {myBitmap = MyHelper.resizePhoto (fotoğraf, bu, dataUri, myImageView); } else {myBitmap = MyHelper.resizePhoto (fotoğraf, yol, myImageView); } if (myBitmap! = null) {myTextView.setText (null); myImageView.setImageBitmap (myBitmap); } mola; }}} private void runTextRecog () {FirebaseVisionImage image = FirebaseVisionImage.fromBitmap (myBitmap); FirebaseVisionTextDetector detector = FirebaseVision.getInstance (). GetVisionTextDetector (); detector.detectInImage (image) .addOnSuccessListener (yeni OnSuccessListener)() {@Override public void onSuccess (FirebaseVisionText metinleri) {processExtractedText (metinler); }}). addOnFailureListener (new OnFailureListener () {@ Genel geçersiz geçersiz onFailure (@NonNull İstisna istisnası) {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); dönüş; } (FirebaseVisionText.Block bloğu: firebaseVisionText.getBlocks ()) {myTextView.append (block.getText ()); }}}

Projeyi test etmek

Şimdi ML Kit’in Metin Tanıma’nın iş başında olduğunu görme zamanı! Bu projeyi bir Android cihaza veya AVD'ye yükleyin, galeriden bir resim seçin ve sonra “Metni kontrol et” düğmesine bir kez dokunun. Uygulama, görüntüdeki tüm metni ayıklayarak ve ardından bir TextView'da görüntüleyerek yanıt vermelidir.

Resminizin boyutuna ve içerdiği metin miktarına bağlı olarak, çıkarılan metni görmek için kaydırma yapmanız gerekebileceğini unutmayın.

Tamamlanan projeyi GitHub'dan da indirebilirsiniz.

Sarma

Artık, ML Kit kullanarak bir görüntüdeki metni nasıl tespit edeceğinizi ve çıkaracağınızı biliyorsunuz.

Metin Tanıma API'sı ML Kit'in yalnızca bir parçasıdır. Bu SDK ayrıca, Akıllı Yanıtlama ve yüksek yoğunluklu bir yüz hatlarına sahip API dahil olmak üzere yaygın mobil kullanım durumları için daha fazla API ekleme planlarıyla birlikte barkod tarama, yüz tanıma, görüntü etiketleme ve dönüm noktası tanıma özelliği de sunar.

Hangi ML Kit API'sini denemek için en çok ilgileniyorsunuz? Aşağıdaki yorumlarda bize bildirin!

Bugünün ayıının bir kopyaını alabiliriniz.New York Time, tranger Thing evreniyle ilgili ahte reklamları deşifre ederek Google Len’le biraz eğlenebiliriniz....

Prime Day’in 15 Temmuz’da başlamaı planlanan Amazon India, OnePlu hayranları için yaklaşmakta olan alışveriş gününde ürpriz yapacak. Ancak, Amazon Hinditan, ürprizin gerektird...

Taze Yayınlar