Як витягнути текст із зображень за допомогою пакета SDK для машинного навчання Google

Автор: John Stephens
Дата Створення: 27 Січень 2021
Дата Оновлення: 5 Липня 2024
Anonim
🐍 Python 101: Learn Python Basics for Absolute Beginners [FULL Course]
Відеоролик: 🐍 Python 101: Learn Python Basics for Absolute Beginners [FULL Course]

Зміст


Ви також можете використати API розпізнавання тексту як основу для програм перекладу або служб доступності, де користувач може вказати камеру на будь-який текст, з яким він бореться, і прочитати їх вголос.

У цьому підручнику ми закладемо основу для широкого спектру інноваційних функцій, створивши додаток, який може витягувати текст із будь-якого зображення в галереї користувача. Хоча ми не будемо висвітлювати його в цьому підручнику, ви також можете в режимі реального часу зафіксувати текст із оточення користувача, підключивши цю програму до камери пристрою.

На пристрої чи в хмарі?

Деякі API-пакети ML Kit доступні лише на пристрої, але деякі доступні на пристрої та в хмарі, включаючи API розпізнавання тексту.

Хмарний API API може визначати більш широкий спектр мов та символів та обіцяє більшу точність, ніж його аналог на пристрої. Однак це робить вимагають активного підключення до Інтернету, і він доступний лише для проектів рівня Blaze.


У цій статті ми будемо запускати API розпізнавання тексту на локальному рівні, тож ви можете слідувати далі, незалежно від того, оновлено ви до Blaze, чи ви користуєтеся безкоштовним планом Firebase Spark.

Створення програми розпізнавання тексту за допомогою ML Kit

Створіть програму з налаштуваннями на ваш вибір, але, коли з’явиться запит, виберіть шаблон «Порожня активність».

ML Kit SDK є частиною Firebase, тому вам потрібно буде підключити свій проект до Firebase, використовуючи його сертифікат підписання SHA-1. Щоб отримати SHA-1 вашого проекту:

  • Виберіть вкладку «Gradle» Android Studio.
  • На панелі "Проекти Gradle" двічі клацніть, щоб розгорнути "корінь" вашого проекту, а потім виберіть "Завдання> Android> Звіт про підписання".
  • Панель, розташована внизу вікна Android Studio, повинна оновитись, щоб відобразити деяку інформацію про цей проект, включаючи його сертифікат підписання SHA-1.


Щоб підключити ваш проект до Firebase:

  • У веб-переглядачі запустіть консоль Firebase.
  • Виберіть "Додати проект".
  • Дайте назву проекту; Я використовую "Тест ML".
  • Прочитайте положення та умови, і якщо ви раді продовжити, виберіть "Я приймаю ...", а потім "Створити проект".
  • Виберіть "Додати Firebase до програми Android".
  • Введіть назву пакета вашого проекту, яку ви знайдете вгорі файлу MainActivity та всередині Manifest.
  • Введіть сертифікат підписання SHA-1 вашого проекту.
  • Натисніть «Зареєструвати додаток».
  • Виберіть "Завантажити google-services.json". Цей файл містить усі необхідні метадані Firebase для вашого проекту, включаючи ключ API.
  • У студії Android перетягніть файл 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 (dir: libs, include:) реалізація 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, де ми покажемо витягнутий текст.
  • A ScrollView. Оскільки немає гарантії, що витягнутий текст буде чітко розміщуватися на екрані, я збираюся розмістити TextView всередині ScrollView.

Ось готовий файл Activity_main.xml:

Цей макет посилається на "ic_placeholder", що малюється, тому давайте створимо це зараз:

  • На панелі інструментів Android Studio виберіть "Файл> Новий> Актив зображення".
  • Відкрийте спадне меню "Тип значка" та виберіть "Значки панелі дій та вкладок".
  • Переконайтесь, що вибрано перемикач "Art Art".
  • Натисніть кнопку "Арт-кліп".
  • Виберіть зображення, яке ви хочете використовувати в якості заповнювача; Я використовую "Додати до фотографій".
  • Натисніть «ОК».
  • Відкрийте спадне меню "Тема" та виберіть "HOLO_LIGHT".
  • У полі "Ім'я" введіть "ic_placeholder".
  • Натисніть «Далі». Прочитайте інформацію, і якщо ви раді продовжити, натисніть «Готово».

Піктограми рядка дій: запуск програми Галерея

Далі я збираюся створити елемент рядка дій, який запустить галерею користувача, готовий вибрати зображення.

Ви визначаєте піктограми рядка дій всередині файлу ресурсу меню, який знаходиться в каталозі "res / menu". Якщо ваш проект не містить цього каталогу, вам знадобиться створити його:

  • Клацніть клавішею управління і натисніть каталог "res" вашого проекту та виберіть "New> Каталог ресурсів Android".
  • Відкрийте спадне меню "Тип ресурсу" та виберіть "меню".
  • "Ім'я каталогів" повинно автоматично оновлюватися до "меню", але якщо це не так, вам потрібно буде перейменовувати його вручну.
  • Натисніть «ОК».

Тепер ви готові створити файл ресурсу меню:

  • Клацніть на клавіші меню меню вашого проекту та виберіть "Створити> Файл ресурсів меню".
  • Назвіть цей файл «мій_меню».
  • Натисніть «ОК».
  • Відкрийте файл "my_menu.xml" і додайте наступне:

// Створити елемент для кожної дії //

У файлі меню посилається на рядок "action_gallery", тому відкрийте файл res / values ​​/ strings.xml вашого проекту та створіть цей ресурс. Хоча я тут, я також визначаю інші рядки, які ми будемо використовувати в цьому проекті.

Галерея Цей додаток потребує доступу до файлів на вашому пристрої. Не знайдено тексту

Потім скористайтеся програмою Image Asset Studio, щоб створити піктограму "ic_gallery" на панелі дій:

  • Виберіть "Файл> Створити> Актив зображення".
  • Установіть спадне меню "Тип значка" на "Значки панелі дій та вкладок".
  • Клацніть кнопку "Арт-кліп".
  • Оберіть креслярський; Я використовую "зображення".
  • Натисніть «ОК».
  • Щоб переконатися, що цей значок добре видно на панелі дій, відкрийте спадне меню "Тема" та виберіть "HOLO_DARK".
  • Назвіть цей значок «ic_gallery».
  • "Натисніть" Далі ", а потім -" Готово ".

Обробка запитів на дозвіл та натиснення подій

Я буду виконувати всі завдання, не пов’язані безпосередньо з API розпізнавання тексту в окремому класі BaseActivity, включаючи інстанціювання меню, обробку подій натискання на панелі дій та запит на доступ до пам’яті пристрою.

  • Виберіть "Файл> Новий> Клас Java" на панелі інструментів Android Studio.
  • Назвіть цей клас «BaseActivity».
  • Натисніть «ОК».
  • Відкрийте 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; імпорт 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 (збереженийInstanceState); ActionBar actionBar = getSupportActionBar (); якщо (actionBar! = null) {actionBar.setDisplayHomeAsUpEnabled (вірно); actionBar.setTitle (getIntent (). getStringExtra (ACTION_BAR_TITLE)); }} @ Oververide 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) {//...call selectPicture // selectPicture ( ); // Якщо відхилено запит на дозвіл, то ... //} else {//... відобразити рядок "дозвіл_запит" // requestPermission (це, requestCode, R.string.permission_request); } перерву; }} // Відображення діалогового вікна запиту на дозвіл // загальнодоступний статичний запит про недійсністьПродання (остаточна активність, остаточний запит int, код, int msg) {AlertDialog.Builder попередження = новий AlertDialog.Builder (активність); alert.set (мсг); alert.setPositiveButton (android.R.string.ok, новий DialogInterface.OnClickListener () {@Override public void onClick (DialogInterface dialogInterface, int i) {dialogInterface.dismiss (); .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 (помилково); alar.show (); } // Перевірте, чи надав користувач дозвіл WRITE_STORAGE // public void checkPermission (int requestCode) {switch (requestCode) {case WRITE_STORAGE: int hasWriteExternalStoragePermission = ActivityCompat.checkSelfPermission (це, Manifest.permission.WRITE_EXTERNAL); // Якщо у нас є доступ до зовнішнього сховища ... // if (hasWriteExternalStoragePermission == PackageManager.PERMISSION_GRANTED) {//...call 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.El Environment; імпортувати android.widget.ImageView; імпорт android.provider.MediaStore; імпорт android.net.Uri; імпортувати статичний android.graphics.BitmapFactory.decodeFile; імпортувати статичний android.graphics.BitmapFactory.decodeStream; імпорт java.io.File; імпорт java.io.FileNotFoundException; імпорт 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; if (cursor! = null) {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 = новий 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 ()); повернути compressPhoto (imageFile, BitmapFactory.decodeStream (context.getContentResolver (). openInputStream (uri), null, newOptions)); } лов (виняток FileNotFoundException) {izjem.printStackTrace (); повернути нуль; }} публічний статичний Bitmap resizePhoto (файл imageFile, шлях рядка, перегляд ImageView) {Параметри BitmapFactory.Options = нові BitmapFactory.Options (); decodeFile (шлях, параметри); int photoHeight = options.outHeight; int photoWidth = options.outWidth; options.inSampleSize = Math.min (photoWidth / view.getWidth (), photoHeight / view.getHeight ()); повернути compressPhoto (imageFile, BitmapFactory.decodeFile (шлях, параметри)); } приватний статичний Bitmap compressPhoto (Файл photoFile, Bitmap bitmap) {спробуйте {FileOutputStream fOutput = новий FileOutputStream (photoFile); bitmap.compress (Bitmap.CompressFormat.JPEG, 70, fOutput); fOutput.close (); } лов (виняток IOException) {izjem.printStackTrace (); } повернути растрову карту; }}

Встановіть зображення на ImageView

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

імпорт android.graphics.Bitmap; імпортувати android.os.Bundle; імпортувати android.widget.ImageView; імпорт android.content.Intent; імпортувати android.widget.TextView; імпорт android.net.Uri; публічний клас MainActivity розширює BaseActivity {приватний Bitmap myBitmap; приватний ImageView myImageView; приватний TextView myTextView; @Override захищений недійсним onCreate (пакет збереженихInstanceState) {super.onCreate (збереженийInstanceState); 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) {switch (requestCode) {case 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; імпортувати android.view.View; імпорт android.net.Uri; публічний клас MainActivity розширює BaseActivity реалізує View.OnClickListener {private Bitmap myBitmap; приватний ImageView myImageView; приватний TextView myTextView; @Override захищений недійсним onCreate (пакет збереженихInstanceState) {super.onCreate (збереженийInstanceState); setContentView (R.layout.activity_main); myTextView = findViewById (R.id.textView); myImageView = findViewById (R.id.imageView); findViewById (R.id.checkText) .setOnClickListener (це); } @Override public void onClick (Перегляд подання) {switch (view.getId ()) {case R.id.checkText: якщо (myBitmap! = Null) {// Ми будемо реалізовувати runTextRecog на наступному кроці // runTextRecog (); } перерву; }}

ML Kit може обробляти зображення лише у форматі FirebaseVisionImage, тому нам потрібно перетворити наше зображення в об’єкт FirebaseVisionImage. Ви можете створити FirebaseVisionImage з Bitmap, media.Image, ByteBuffer або байтового масиву. Оскільки ми працюємо з Bitmaps, нам потрібно викликати утилітний метод fromBitmap () класу FirebaseVisionImage і передати його нашому Bitmap.

private 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 виключення) {// Завдання не вдалося за винятком //}}); }

Якщо ця операція завершиться невдаче, я збираюсь показати тост, але якщо операція успішна, я зателефоную 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 // публічна недійсність onFailure (виняток @NonNull виключення) {Toast.makeText (MainActivity.this, "Виняток", Toast.LENGTH_LONG) );}}); }

Щоразу, коли наша програма отримує повідомлення про успіх, нам потрібно проаналізувати результати.

Об'єкт FirebaseVisionText може містити елементи, рядки та блоки, де кожен блок зазвичай прирівнюється до одного абзацу тексту. Якщо FirebaseVisionText повертає 0 блоків, ми відображатимемо рядок "no_text", але якщо вона містить один або кілька блоків, ми відображатимемо отриманий текст як частину нашого TextView.

private 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; імпортувати android.view.View; імпорт 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 (пакет збереженихInstanceState) {super.onCreate (збереженийInstanceState); setContentView (R.layout.activity_main); myTextView = findViewById (R.id.textView); myImageView = findViewById (R.id.imageView); findViewById (R.id.checkText) .setOnClickListener (це); } @Override public void onClick (Перегляд подання) {switch (view.getId ()) {case R.id.checkText: if (myBitmap! = Null) {runTextRecog (); } перерву; }} @ Override захищений недійсним onActivityResult (int requestCode, int resultCode, дані про наміри) {super.onActivityResult (requestCode, resultCode, data); if (resultCode == RESULT_OK) {switch (requestCode) {case 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, "Виняток", Toast.LENGTH_LONG) .show ();}}}); } приватний пустотний процесExtractedText (FirebaseVisionText firebaseVisionText) {myTextView.setText (null); if (firebaseVisionText.getBlocks (). size () == 0) {myTextView.setText (R.string.no_text); повернення; } для (FirebaseVisionText.Block блок: firebaseVisionText.getBlocks ()) {myTextView.append (block.getText ()); }}}

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

Настав час бачити розпізнавання тексту ML Kit у дії! Встановіть цей проект на пристрої Android або AVD, виберіть зображення з галереї та натисніть кнопку "Перевірити текст". Додаток повинен відповісти, витягуючи з тексту весь текст, а потім відображаючи його в TextView.

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

Ви також можете завантажити завершений проект з GitHub.

Підведенню

Тепер ви знаєте, як виявити та витягнути текст із зображення, використовуючи ML Kit.

API розпізнавання тексту - це лише одна частина ML Kit. Цей SDK також пропонує сканування штрих-коду, розпізнавання обличчя, маркування зображень та розпізнавання орієнтирів, планує додати більше API для звичайних випадків мобільного використання, включаючи Smart Response та API контуру обличчя високої щільності.

Який ML Kit API вам найбільше цікаво спробувати? Повідомте нас у коментарях нижче!

На прес-конференції в Нью-Делі компанія Huawei запустила в Індії свій новий смарт-годинник Huawei Watch GT.Huawei Watch GT виглядає як звичайний годинник, триває до двох тижнів за один заряд і зменшує...

Оновлення, 29 жовтня 2019 р. (14:39 ET): Huawei надіслав наступне твердження до у відповідь на повідомлення FCC:За 30 років бізнесу компанія Huawei ніколи не мала серйозних інцидентів, пов'язаних ...

Популярний На Сайті