Как да извлечете текст от изображения с SDK за машинно обучение на Google

Автор: John Stephens
Дата На Създаване: 27 Януари 2021
Дата На Актуализиране: 5 Юли 2024
Anonim
Google Cloud Platform: Практическое применение машинного обучения
Видео: Google Cloud Platform: Практическое применение машинного обучения

Съдържание


Можете също така да използвате API за разпознаване на текст като основа за приложения за превод или услуги за достъпност, където потребителят може да насочи камерата си към всеки текст, с който се бори, и да го прочете на глас.

В този урок ще поставим основата за широк спектър от иновативни функции, като създадем приложение, което може да извлече текст от всяко изображение в галерията на потребителя. Въпреки че няма да го обхващаме в този урок, можете също да заснемете текст в обкръжението на потребителя в реално време, като свържете това приложение с камерата на устройството.

На устройство или в облака?

Някои от API на ML Kit са достъпни само на устройство, но няколко са налични на устройство и в облака, включително API за разпознаване на текст.

Облачният базов текст API може да идентифицира по-широк спектър от езици и знаци и обещава по-голяма точност от този на устройството си. Въпреки това прави изискват активна интернет връзка и е достъпна само за проекти на ниво Blaze.


В тази статия ще стартираме API за разпознаване на текст локално, така че можете да следвате, независимо дали сте надстроени до Blaze, или сте на безплатен план Firebase Spark.

Създаване на приложение за разпознаване на текст с ML Kit

Създайте приложение с настройките по ваш избор, но когато бъдете подканени, изберете шаблона „Празна активност“.

ML Kit SDK е част от Firebase, така че ще трябва да свържете проекта си с Firebase, като използвате своя сертификат за подписване на SHA-1. За да получите SHA-1 на вашия проект:

  • Изберете раздела „Gradle“ на Android Studio.
  • В панела „Проекти на Gradle“ щракнете двукратно, за да разширите „root“ на вашия проект, след което изберете „Задачи> Android> Отчет за подписване“.
  • Панелът в долната част на прозореца на Android Studio трябва да се актуализира, за да се покаже известна информация за този проект - включително неговия сертификат за подписване на SHA-1.


За да свържете проекта си с Firebase:

  • В уеб браузъра си стартирайте конзолата Firebase.
  • Изберете „Добавяне на проект.“
  • Дайте име на проекта си; Използвам „ML Тест“.
  • Прочетете условията и ако сте доволни да продължите, изберете „Приемам…“, последвано от „Създаване на проект“.
  • Изберете „Добавяне на Firebase към приложението ви за Android.“
  • Въведете името на пакета на вашия проект, което ще намерите в горната част на файла MainActivity и вътре в Manifest.
  • Въведете сертификата за подписване на SHA-1 на вашия проект.
  • Кликнете върху „Регистриране на приложението“.
  • Изберете „Изтеглете google-services.json.“ Този файл съдържа всички необходими метаданни на Firebase за вашия проект, включително ключа за API.
  • В Android Studio плъзнете и пуснете файла google-services.json в директорията на приложението на вашия проект.

  • Отворете файла на build.gradle на ниво проект и добавете класния път на услугите на Google:

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

  • Отворете файла на build.gradle на ниво приложение и добавете зависимости за Firebase Core, Firebase ML Vision и интерпретатора на модела, плюс приставката за услуги на Google:

прилагам плъгин: com.google.gms.google-services ... ... ... зависимости {изпълнение fileTree (реж .: libs, включва:) внедряване com.google.firebase: firebase-core: 16.0.1 com com. google.firebase: firebase-ml-vision: 16.0.0 внедряване com.google.firebase: firebase-ml-model-interpreter: 16.0.0

На този етап ще трябва да стартирате проекта си, така че да може да се свърже със сървърите на Firebase:

  • Инсталирайте приложението си или на физически Android смартфон или таблет, или на виртуално устройство за Android (AVD).
  • В конзолата Firebase изберете "Стартиране на приложението, за да проверите инсталацията."
  • След няколко мига трябва да видите „Поздравления“; изберете „Продължете към конзолата.“

Изтеглете предварително обучените модели на машинно обучение на Google

По подразбиране ML Kit само изтегля модели, както и когато са необходими, така че нашето приложение ще изтегли OCR модела, когато потребителят се опита да извлече текст за първи път.

Това потенциално може да има отрицателно въздействие върху потребителското изживяване - представете си, че се опитвате да получите достъп до функция, само за да откриете, че приложението трябва да изтегли повече ресурси, преди да може действително да предостави тази функция. В най-лошия сценарий приложението ви може дори да не може да изтегли необходимите ресурси, когато има нужда от тях, например ако устройството няма връзка с Интернет.

За да сте сигурни, че това не се случва с нашето приложение, ще изтегля необходимия OCR модел на време на инсталиране, което изисква някои промени в Maniest.

Докато Манифестът е отворен, ще добавя и WRITE_EXTERNAL_STORAGE разрешение, което ще го използваме по-късно в този урок.

// Добавете WRITE_EXTERNAL_STORAGE разрешение // // Добавете следното //

Изграждане на оформлението

Нека отстраним лесните неща и да създадем оформление, състоящо се от:

  • ImageView. Първоначално това ще покаже запазено място, но ще се актуализира, след като потребителят избере изображение от галерията си.
  • Бутон, който задейства извличането на текст.
  • TextView, където ще покажем извлечения текст.
  • ScrollView. Тъй като няма гаранция, че извлеченият текст ще се побере добре на екрана, ще поставя TextView в ScrollView.

Ето го готовия файл Activity_main.xml:

Това оформление се позовава на „ic_placeholder“, който може да се чертае, така че нека сега създадем това:

  • Изберете „File> New> Image Asset“ от лентата с инструменти на Android Studio.
  • Отворете падащото меню „Тип на иконата“ и изберете „Икони на лентата за действие и раздели“.
  • Уверете се, че е избран радио бутона „Clip Art“.
  • Щракнете върху бутона „Clip Art“.
  • Изберете изображението, което искате да използвате като свой заместител; Използвам „Добавяне към снимки“.
  • Щракнете върху „OK“.
  • Отворете падащото меню „Тема“ и изберете „HOLO_LIGHT“.
  • В полето „Име“ въведете „ic_placeholder“.
  • Щракнете върху „Напред“. Прочетете информацията и ако сте доволни да продължите, щракнете върху „Край“.

Икони на лентата за действие: Стартиране на приложението Галерия

След това ще създам елемент от лентата за действие, който ще стартира галерията на потребителя, готов да избере изображение.

Дефинирате иконите на лентата за действие във файла с ресурс на менюто, който живее в директорията „res / menu“. Ако вашият проект не съдържа тази директория, ще трябва да го създадете:

  • Щракнете върху контролния бутон „res“ на вашия проект и изберете „New> Android Resource Directory“.
  • Отворете падащото меню „Тип ресурс“ и изберете „меню“.
  • „Името на директория“ трябва да се актуализира автоматично до „меню“, но ако не е, ще трябва да го преименувате ръчно.
  • Щракнете върху „OK“.

Вече сте готови да създадете файл с ресурси на менюто:

  • Щракнете върху контролния бутон на менюто на вашия проект и изберете „Ново> Файл с ресурси от менюто“.
  • Името на този файл е "my_menu."
  • Щракнете върху „OK“.
  • Отворете файла „my_menu.xml“ и добавете следното:

// Създаване на елемент за всяко действие //

Файлът от менюто препраща низ „action_gallery“, така че отворете файла Res / values ​​/ strings.xml на вашия проект и създайте този ресурс. Докато съм тук, определям и другите низове, които ще използваме в този проект.

галерия Това приложение трябва да има достъп до файлове на вашето устройство. Няма намерен текст

След това използвайте Image Asset Studio, за да създадете иконата „ic_gallery“ на лентата за действие:

  • Изберете "Файл> Ново> Актив на изображението."
  • Задайте падащото меню „Тип на иконата“ на „Икони на лентата за действие и раздела“.
  • Щракнете върху бутона „Clip Art“.
  • Изберете чертеж; Използвам „изображение“.
  • Щракнете върху „OK“.
  • За да сте сигурни, че тази икона е ясно видима в лентата за действие, отворете падащото меню „Тема“ и изберете „HOLO_DARK“.
  • Назовете тази икона „ic_gallery.“
  • „Щракнете върху„ Напред “, последвано от„ Край “.

Работа с заявки за разрешения и щракване върху събития

Ще изпълня всички задачи, които не са пряко свързани с API за разпознаване на текст в отделен клас BaseActivity, включително инсталиране на менюто, обработка на събития за щракване на действие в действие и искане на достъп до хранилището на устройството.

  • Изберете „Файл> Ново> Java клас“ от лентата с инструменти на Android Studio.
  • Наименувайте този клас „BaseActivity.“
  • Щракнете върху „OK“.
  • Отворете BaseActivity и добавете следното:

импортиране на android.app.Activity; импортиране на android.support.v4.app.ActivityCompat; импортиране на android.support.v7.app.ActionBar; импортиране на android.support.v7.app.AlertDialog; импортиране на android.support.v7.app.AppCompatActivity; импортиране на android.os.Bundle; импортиране на android.content.DialogInterface; импортиране на android.content.Intent; импортиране на android.Manifest; импортиране на android.provider.MediaStore; импортиране на android.view.Menu; импортиране на android.view.MenuItem; импортиране на android.content.pm.PackageManager; import android.net.Uri; импортиране на android.provider.Настройки; импортиране на android.support.annotation.NonNull; импортиране на android.support.annotation.Nullable; внос java.io.File; публичен клас BaseActivity разширява AppCompatActivity {public static final int WRITE_STORAGE = 100; публичен статичен краен int SELECT_PHOTO = 102; публичен статичен финален низ ACTION_BAR_TITLE = "action_bar_title"; публична снимка на файла; @Override защитена празнота onCreate (@Nullable Bundle saveInstanceState) {super.onCreate (saveInstanceState); ActionBar actionBar = getSupportActionBar (); ако (actionBar! = null) {actionBar.setDisplayHomeAsUpEnabled (вярно); actionBar.setTitle (getIntent () getStringExtra (ACTION_BAR_TITLE).); }} @Override public boolean onCreateOptionsMenu (меню от меню) {getMenuInflater (). Надуване (R.menu.my_menu, меню); връщане вярно; } @Override public boolean onOptionsItemSelected (MenuItem елемент) {превключвател (item.getItemId ()) {// Ако е избран „галерия за управление“, тогава ... // случай R.id.gallery washing: //... проверете имаме разрешението WRITE_STORAGE // checkPermission (WRITE_STORAGE); прекъсване; } връщане на super.onOptionsItemSelected (елемент); } @Override public void onRequestPermissionsResult (разрешения int requestCode, @NonNull String, @NonNull int grantResults) {super.onRequestPermissionsResult (requestCode, разрешения, grantResults); превключвател (requestCode) {case WRITE_STORAGE: // Ако заявката за разрешение е предоставена, тогава ... // ако (grantResults.length> 0 && grantResults == PackageManager.PERMISSION_GRANTED) {//...избиране selectPicture // selectPicture ( ); // Ако заявката за разрешение е отказана, тогава ... //} else {//...дисплете низа „звод_изискване “// requestPermission (това, requestCode, R.string.permission_request); } почивка; }} // Показване на диалоговия прозорец за заявка за разрешение // публична статична заявка за невалидностПредаване (окончателна активност на активността, окончателен int requestCode, int msg) {AlertDialog.Builder предупреждение = нов AlertDialog.Builder (дейност); alert.set (MSG); alarm.setPositiveButton (android.R.string.ok, нов DialogInterface.OnClickListener () {@Override public void onClick (DialogInterface dialogInterface, int i) | .setData (Uri.parse ("пакет:" + activity.getPackageName ())); activity.startActivityForResult (permissonIntent, requestCode);}}); alarm.setNegativeButton (android.R.string.cancel, нов DialogInterface.OnClickListener () {@Override public void onClick (DialogInterface dialogInterface, int i) {dialogInterface.dismiss ();}}); alert.setCancelable (фалшива); alert.show (); } // Проверете дали потребителят е предоставил разрешението WRITE_STORAGE // public void checkPermission (int requestCode) {превключвател (requestCode) {case WRITE_STORAGE: int hasWriteExternalStoragePermission = ActivityCompat.checkSelfPermission (this, Manifest.permission.WRITE_EXTERNAL); // Ако имаме достъп до външно съхранение ... // if (hasWriteExternalStoragePermission == PackageManager.PERMISSION_GRANTED) {//...извикване selectPicture, което стартира дейност, при която потребителят може да избере изображение // selectPicture (); // Ако разрешението не е предоставено, тогава ... //} else {//...искайте разрешението // ActivityCompat.requestPermissions (това, нов String {Manifest.permission.WRITE_EXTERNAL_STORAGE}, codeCode); } почивка; }} частна празнота selectPicture () {photo = MyHelper.createTempFile (снимка); Намерено намерение = ново намерение (Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); // Стартиране на активност, при която потребителят може да избере изображение // startActivityForResult (намерение, SELECT_PHOTO); }}

На този етап вашият проект трябва да се оплаква, че не може да разреши MyHelper.createTempFile. Нека изпълним това сега!

Преоразмеряване на изображения с createTempFile

Създайте нов клас „MyHelper“. В този клас ще променим размера на избраното от потребителя изображение, готово да бъде обработено чрез API за разпознаване на текст.

импортиране на android.graphics.Bitmap; импортиране на android.graphics.BitmapFactory; импортиране на android.content.Context; импортиране на android.database.Cursor; импортиране на android.os.Elvironment; импортиране на android.widget.ImageView; импортиране на android.provider.MediaStore; import android.net.Uri; импортиране на статични android.graphics.BitmapFactory.decodeFile; импортиране на статични android.graphics.BitmapFactory.decodeStream; внос java.io.File; импортиране на java.io.FileNotFoundException; import java.io.FileOutputStream; импортиране java.io.IOException; публичен клас MyHelper {public static String getPath (контекст на контекста, Uri uri) {String path = ""; Проекция на струни = {MediaStore.Images.Media.DATA}; Cursor cursor = context.getContentResolver (). Заявка (uri, проекция, null, null, null); int column_index; ако (курсор! = нула) {column_index = cursor.getColumnIndexOrThrow (MediaStore.Images.Media.DATA); cursor.moveToFirst (); path = cursor.getString (column_index); cursor.close (); } път за връщане; } публичен статичен файл createTempFile (файл файл) {Файлова директория = нов файл (Environment.getExternalStorageDirectory (). getPath () + "/com.jessicathornsby.myapplication"); if (! directory.exists () ||! directory.isDirectory ()) {directory.mkdirs (); } if (file == null) {file = new File (директория, "orig.jpg"); } връщане на файла; } публичен статичен Bitmap resizePhoto (Файл imageFile, контекст на контекста, Uri uri, изглед на ImageView) {BitmapFactory.Options newOptions = new BitmapFactory.Options (); опитайте {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 ()); връщане на компресияPhoto (imageFile, BitmapFactory.decodeStream (context.getContentResolver (). openInputStream (uri), null, newOptions)); } улавяне (изключение на FileNotFoundException) {изключение.printStackTrace (); връща нула; }} публичен статичен Bitmap resizePhoto (Файл imageFile, String path, ImageView view) {BitmapFactory.Options options = new BitmapFactory.Options (); decodeFile (път, опции); int photoHeight = options.outHeight; int photoWidth = options.outWidth; options.inSampleSize = Math.min (photoWidth / view.getWidth (), photoHeight / view.getHeight ()); връщане на компресияPhoto (imageFile, BitmapFactory.decodeFile (път, опции)); } частен статичен Bitmap compressPhoto (Файл photoFile, Bitmap bitmap) {опитайте {FileOutputStream fOutput = нов FileOutputStream (photoFile); bitmap.compress (Bitmap.CompressFormat.JPEG, 70, fOutput); fOutput.close (); } улов (изключение на IOException) {изключение.printStackTrace (); } връщане на растерна карта; }}

Задайте изображението на ImageView

След това трябва да внедрим onActivityResult () в нашия клас MainActivity и да зададем избраното от потребителя изображение на нашия ImageView.

импортиране на android.graphics.Bitmap; импортиране на android.os.Bundle; импортиране на android.widget.ImageView; импортиране на android.content.Intent; импортиране на android.widget.TextView; import android.net.Uri; обществен клас MainActivity разширява BaseActivity {private Bitmap myBitmap; частен ImageView myImageView; частен TextView myTextView; @Override защитена празнота onCreate (Bundle saveInstanceState) {super.onCreate (saveInstanceState); setContentView (R.layout.activity_main); myTextView = findViewById (R.id.textView); myImageView = findViewById (R.id.imageView); } @Override защитен празнота onActivityResult (int requestCode, int resultCode, данни за намерения) {super.onActivityResult (requestCode, resultCode, data); if (resultCode == RESULT_OK) {превключвател (requestCode) {случай WRITE_STORAGE: checkPermission (requestCode); прекъсване; случай SELECT_PHOTO: Uri dataUri = data.getData (); String path = MyHelper.getPath (това, dataUri); if (path == null) {myBitmap = MyHelper.resizePhoto (снимка, това, dataUri, myImageView); } else {myBitmap = MyHelper.resizePhoto (снимка, път, myImageView); } if (myBitmap! = null) {myTextView.setText (null); myImageView.setImageBitmap (myBitmap); } почивка; }}}}

Стартирайте този проект на физическо устройство с Android или AVD и кликнете върху иконата на лентата за действие. Когато бъдете подканени, дайте разрешението WRITE_STORAGE и изберете изображение от галерията; това изображение сега трябва да се показва в потребителския интерфейс на приложението ви.

Сега ние положихме основите, ние сме готови да започнем да извличаме малко текст!

Преподаване на приложение за разпознаване на текст

Искам да задействам разпознаване на текст в отговор на събитие при кликване, така че трябва да внедрим OnClickListener:

импортиране на android.graphics.Bitmap; импортиране на android.os.Bundle; импортиране на android.widget.ImageView; импортиране на android.content.Intent; импортиране на android.widget.TextView; import android.view.View; import android.net.Uri; обществен клас MainActivity разширява BaseActivity реализира View.OnClickListener {private Bitmap myBitmap; частен ImageView myImageView; частен TextView myTextView; @Override защитена празнота onCreate (Bundle saveInstanceState) {super.onCreate (saveInstanceState); setContentView (R.layout.activity_main); myTextView = findViewById (R.id.textView); myImageView = findViewById (R.id.imageView); findViewById (R.id.checkText) .setOnClickListener (това); } @Override public void onClick (View view) {превключвател (view.getId ()) {case R.id.checkText: ако (myBitmap! = Null) {// Ще изпълним runTextRecog в следващата стъпка // runTextRecog (); } почивка; }}

ML Kit може да обработва изображения само когато са във формат FirebaseVisionImage, така че трябва да преобразуваме изображението си в обект FirebaseVisionImage. Можете да създадете FirebaseVisionImage от Bitmap, media.Image, ByteBuffer или byte масив. Тъй като работим с Bitmaps, трябва да се обадим на полезния метод fromBitmap () на класа FirebaseVisionImage и да го предадем нашият Bitmap.

частен void runTextRecog () {FirebaseVisionImage image = FirebaseVisionImage.fromBitmap (myBitmap);

ML Kit има различни класове на детектори за всяка своя операция по разпознаване на изображения. За текст трябва да използваме класа FirebaseVisionTextDetector, който извършва оптично разпознаване на символи (OCR) на изображение.

Създаваме екземпляр на FirebaseVisionTextDetector, използвайки getVisionTextDetector:

Детектор FirebaseVisionTextDetector = FirebaseVision.getInstance (). GetVisionTextDetector ();

След това трябва да проверим FirebaseVisionImage за текст, като се обадим на метода detectInImage () и да го предадем на обекта FirebaseVisionImage. Също така трябва да внедряваме обажданията на onSuccess и onFailure, както и съответните слушатели, така че нашето приложение да бъде известявано, когато резултатите станат достъпни.

detector.detectInImage (изображение) .addOnSuccessListener (нов OnSuccessListener() {@Override // За да направите //}}). AddOnFailureListener (нов OnFailureListener () {@Override public void onFailure (изключение на @NonNull Exception) {// Задачата не бе успешна с изключение //}}); }

Ако тази операция не успее, ще покажа тост, но ако операцията е успешна, ще извикам processExtractedText с отговора.

В този момент кодът ми за откриване на текст изглежда така:

// Създаване на FirebaseVisionImage // private void runTextRecog () {FirebaseVisionImage image = FirebaseVisionImage.fromBitmap (myBitmap); // Създаване на екземпляр на FirebaseVisionCloudTextDetector // FirebaseVisionTextDetector detector = FirebaseVision.getInstance (). GetVisionTextDetector (); // Регистрирайте OnSuccessListener // detector.detectInImage (изображение) .addOnSuccessListener (нов OnSuccessListener() {@Override // Прилагане на обратното обаждане onSuccess // public void onSuccess (текстове на FirebaseVisionText) {// Процес на обажданеExtractedText с отговор // processExtractedText (текстове); }}). addOnFailureListener (нов OnFailureListener () {@Override // Прилагане на извикването onFailure // публично void onFailure (изключение за изключение на @NonNull) {Toast.makeText (MainActivity.this, "Exception", Toast.LENGTH_LONG) );}}); }

Всеки път, когато нашето приложение получава известие за успех, трябва да анализираме резултатите.

Обектът FirebaseVisionText може да съдържа елементи, линии и блокове, където всеки блок обикновено се равнява на един абзац от текст. Ако FirebaseVisionText върне 0 блока, тогава ще покажем низ "no_text", но ако той съдържа един или повече блока, ще покажем извлечения текст като част от нашия TextView.

частен void processExtractedText (FirebaseVisionText firebaseVisionText) {myTextView.setText (null); if (firebaseVisionText.getBlocks (). size () == 0) {myTextView.setText (R.string.no_text); се върне; } за (FirebaseVisionText.Block блок: firebaseVisionText.getBlocks ()) {myTextView.append (block.getText ()); }}}

Ето завършения код на MainActivity:

импортиране на android.graphics.Bitmap; импортиране на android.os.Bundle; импортиране на android.widget.ImageView; импортиране на android.content.Intent; импортиране на android.widget.TextView; импортиране на android.widget.Toast; import android.view.View; import android.net.Uri; импортиране на android.support.annotation.NonNull; импортиране на com.google.firebase.ml.vision.common.FirebaseVisionImage; импортиране на com.google.firebase.ml.vision.text.FirebaseVisionText; импортиране на com.google.firebase.ml.vision.text.FirebaseVisionTextDetector; импортиране на com.google.firebase.ml.vision.FirebaseVision; импортиране на com.google.android.gms.tasks.OnSuccessListener; импортиране на com.google.android.gms.tasks.OnFailureListener; обществен клас MainActivity разширява BaseActivity реализира View.OnClickListener {private Bitmap myBitmap; частен ImageView myImageView; частен TextView myTextView; @Override защитена празнота onCreate (Bundle saveInstanceState) {super.onCreate (saveInstanceState); setContentView (R.layout.activity_main); myTextView = findViewById (R.id.textView); myImageView = findViewById (R.id.imageView); findViewById (R.id.checkText) .setOnClickListener (това); } @Override public void onClick (View view) {превключвател (view.getId ()) {case R.id.checkText: if (myBitmap! = Null) {runTextRecog (); } почивка; }} @ Oververide void onActivityResult (int requestCode, int resultCode, Intent data) {super.onActivityResult (requestCode, resultCode, data); if (resultCode == RESULT_OK) {превключвател (requestCode) {случай WRITE_STORAGE: checkPermission (requestCode); прекъсване; случай SELECT_PHOTO: Uri dataUri = data.getData (); String path = MyHelper.getPath (това, dataUri); if (path == null) {myBitmap = MyHelper.resizePhoto (снимка, това, dataUri, myImageView); } else {myBitmap = MyHelper.resizePhoto (снимка, път, myImageView); } if (myBitmap! = null) {myTextView.setText (null); myImageView.setImageBitmap (myBitmap); } почивка; }}} частен void runTextRecog () {FirebaseVisionImage image = FirebaseVisionImage.fromBitmap (myBitmap); Детектор FirebaseVisionTextDetector = FirebaseVision.getInstance (). GetVisionTextDetector (); detector.detectInImage (изображение) .addOnSuccessListener (нов OnSuccessListener() {@Override public void onSuccess (текстове на FirebaseVisionText) {processExtractedText (текстове); }}). addOnFailureListener (нов OnFailureListener () {@Override public void onFailure (изключение на @NonNull изключение) {Toast.makeText (MainActivity.this, "Exception", Toast.LENGTH_LONG) .show ();}}); } частен void processExtractedText (FirebaseVisionText firebaseVisionText) {myTextView.setText (null); if (firebaseVisionText.getBlocks (). size () == 0) {myTextView.setText (R.string.no_text); се върне; } за (FirebaseVisionText.Block блок: firebaseVisionText.getBlocks ()) {myTextView.append (block.getText ()); }}}

Тестване на проекта

Сега е време да видите разпознаването на текст на Kit Kit в действие! Инсталирайте този проект на устройство с Android или AVD, изберете изображение от галерията и след това натиснете бутона „Проверете текста“. Приложението трябва да отговори, като извлече целия текст от изображението и след това да го покаже в TextView.

Обърнете внимание, че в зависимост от размера на вашето изображение и количеството текст, което съдържа, може да се наложи да превъртите, за да видите целия извлечен текст.

Можете също да изтеглите завършения проект от GitHub.

Обобщавайки

Вече знаете как да откривате и извличате текст от изображение, използвайки ML Kit.

API за разпознаване на текст е само една част от ML Kit. Този SDK предлага също сканиране на баркод, разпознаване на лица, маркиране на изображения и разпознаване на ориентир, като планира да добавите още API за обикновени случаи на мобилна употреба, включително Smart Reply и API с високо плътност на контура на лицето.

Кой ML Kit API сте най-заинтересовани да опитате? Уведомете ни в коментарите по-долу!

Вече знаем, че Motorola работи върху сгъваем телефон с разтегателна обвивка, предполагаемо използвайки името RAZR. Сега изглежда, че harp има желание да възприеме и този дизайн, тъй като днес представ...

Академия Шоу предлага акредитирани интерактивни курсове, ръководени от експерти, за да научите възобновяване на нови умения със собствено темпо. Можете да разширите компетенциите си, без да бъдете сма...

Прочетете Днес