Как извлечь текст из изображений с помощью Google Machine Learning SDK

Автор: John Stephens
Дата создания: 27 Январь 2021
Дата обновления: 5 Июль 2024
Anonim
Распознавание текста с изображения на Python | EasyOCR vs Tesseract | Компьютерное зрение
Видео: Распознавание текста с изображения на Python | EasyOCR vs Tesseract | Компьютерное зрение

Содержание


Вы также можете использовать 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» дважды щелкните, чтобы развернуть «корневой каталог» проекта, а затем выберите «Задачи> Android> Отчет о подписи».
  • Панель в нижней части окна Android Studio должна обновиться, чтобы отобразить некоторую информацию об этом проекте, включая сертификат подписи SHA-1.


Чтобы подключить ваш проект к Firebase:

  • В вашем веб-браузере запустите консоль Firebase.
  • Выберите «Добавить проект».
  • Дайте вашему проекту имя; Я использую «ML Test».
  • Прочитайте условия и положения. Если вы готовы продолжить, выберите «Я принимаю…», а затем «Создать проект».
  • Выберите «Добавить Firebase в ваше приложение для Android».
  • Введите имя пакета вашего проекта, которое вы найдете в верхней части файла MainActivity и внутри Манифеста.
  • Введите сертификат подписи вашего проекта SHA-1.
  • Нажмите «Зарегистрировать приложение».
  • Выберите «Download google-services.json». Этот файл содержит все необходимые метаданные Firebase для вашего проекта, включая ключ API.
  • В Android Studio перетащите файл google-services.json в каталог «app» вашего проекта.

  • Откройте файл 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 ком. google.firebase: firebase-ml-vision: реализация 16.0.0 com.google.firebase: firebase-ml-model-интерпретатор: 16.0.0

На этом этапе вам необходимо запустить проект, чтобы он мог подключаться к серверам Firebase:

  • Установите приложение на физический смартфон или планшет Android или виртуальное устройство Android (AVD).
  • В консоли Firebase выберите «Запустить приложение для проверки установки».
  • Через несколько секунд вы должны увидеть «Поздравления»; выберите «Перейти к консоли».

Загрузите предварительно обученные модели машинного обучения Google

По умолчанию ML Kit загружает модели только по мере необходимости, поэтому наше приложение загрузит модель распознавания, когда пользователь впервые попытается извлечь текст.

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

Чтобы этого не случилось с нашим приложением, я собираюсь загрузить необходимую модель OCR во время установки, что требует некоторых изменений в Maniest.

Пока у нас открыт Манифест, я также собираюсь добавить разрешение WRITE_EXTERNAL_STORAGE, которое мы будем использовать позже в этом руководстве.

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

Построение макета

Давайте избавимся от простых вещей и создадим макет, состоящий из:

  • ImageView. Первоначально, это будет отображать заполнитель, но он будет обновляться, когда пользователь выбирает изображение из своей галереи.
  • Кнопка, которая запускает извлечение текста.
  • TextView, где мы будем отображать извлеченный текст.
  • ScrollView. Поскольку нет гарантии, что извлеченный текст будет аккуратно помещаться на экране, я собираюсь поместить TextView в ScrollView.

Вот готовый файл activity_main.xml:

Этот макет ссылается на «ic_placeholder», поэтому давайте создадим его сейчас:

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

Значки панели действий: запуск приложения Галерея

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

Вы определяете значки панели действий в файле ресурсов меню, который находится в каталоге «res / menu». Если ваш проект не содержит этот каталог, вам нужно его создать:

  • Удерживая нажатой клавишу «Control», щелкните «res» в вашем проекте и выберите «New> Android Resource Directory».
  • Откройте раскрывающийся список «Тип ресурса» и выберите «Меню».
  • «Имя каталога» должно автоматически обновиться до «меню», но если этого не произойдет, вам придется переименовать его вручную.
  • Нажмите «ОК».

Теперь вы готовы создать файл ресурсов меню:

  • Удерживая клавишу Control, щелкните папку «menu» вашего проекта и выберите «New> Файл ресурсов меню».
  • Назовите этот файл «my_menu».
  • Нажмите «ОК».
  • Откройте файл «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; import android.support.v4.app.ActivityCompat; import android.support.v7.app.ActionBar; import android.support.v7.app.AlertDialog; import 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; import android.content.pm.PackageManager; импорт android.net.Uri; импорт android.provider.Settings; импорт android.support.annotation.NonNull; импорт android.support.annotation.Nullable; импорт java.io.File; открытый класс BaseActivity extends AppCompatActivity {открытый статический final int WRITE_STORAGE = 100; public static final int SELECT_PHOTO = 102; public static final String ACTION_BAR_TITLE = "action_bar_title"; публичное фото файла; @Override protected void onCreate (@Nullable Bundle SavedInstanceState) {super.onCreate (saveInstanceState); ActionBar actionBar = getSupportActionBar (); if (actionBar! = null) {actionBar.setDisplayHomeAsUpEnabled (true); actionBar.setTitle (getIntent () getStringExtra (ACTION_BAR_TITLE).); }} @Override public boolean onCreateOptionsMenu (Меню меню) {getMenuInflater (). Inflate (R.menu.my_menu, menu); вернуть истину; } @Override public boolean onOptionsItemSelected (MenuItem item) {switch (item.getItemId ()) {// Если выбрано «gallery_action», то ... // case R.id.gallery_action: //... проверить, что у нас есть разрешение WRITE_STORAGE // checkPermission (WRITE_STORAGE); перемена; } return super.onOptionsItemSelected (item); } @Override public void onRequestPermissionsResult (int requestCode, @NonNull String permissions, @NonNull int grantResults) {super.onRequestPermissionsResult (requestCode, permissions, grantResults); switch (requestCode) {case WRITE_STORAGE: // Если запрос на разрешение предоставлен, то ... // if (grantResults.length> 0 && grantResults == PackageManager.PERMISSION_GRANTED) {//...call selectPicture // selectPicture ( ); // Если запрос на разрешение отклонен, то ... //} else {//...display строку «mission_request »// requestPermission (this, requestCode, R.string.permission_request); } перемена; }} // Отображение диалогового окна запроса на разрешение // public static void requestPermission (конечная активность Activity, final int requestCode, int msg) {AlertDialog.Builder alert = new AlertDialog.Builder (активность); alert.set (MSG); alert.setPositiveButton (android.R.string.ok, new DialogInterface.OnClickListener () {@Override public void onClick (DialogInterface dialogInterface, int i) {dialogInterface.dismiss (); Intent permissonIntent = новое намерение (Settings.ACTION_APPLICSET_SETT) per_I .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 (ложь); alert.show (); } // Проверяем, предоставил ли пользователь разрешение WRITE_STORAGE // public void checkPermission (int requestCode) {switch (requestCode) {case WRITE_STORAGE: int hasWriteExternalStoragePermission = ActivityCompat.checkSelfPermission (this, Manifest.permission.WRITE_EXTERNAL_STORAGE) // Если у нас есть доступ к внешнему хранилищу ... // if (hasWriteExternalStoragePermission == PackageManager.PERMISSION_GRANTED) {//...call selectPicture, который запускает действие, в котором пользователь может выбрать изображение // selectPicture (); // Если разрешение не было предоставлено, то ... //} else {//... запросить разрешение // ActivityCompat.requestPermissions (this, new String {Manifest.permission.WRITE_EXTERNAL_STORAGE}, requestCode); } перемена; }} private void selectPicture () {photo = MyHelper.createTempFile (photo); Намерение намерения = новое намерение (Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); // Запускаем Activity, где пользователь может выбрать изображение // startActivityForResult (intent, SELECT_PHOTO); }}

На этом этапе ваш проект должен жаловаться, что не может разрешить MyHelper.createTempFile. Давайте реализуем это сейчас!

Изменение размера изображений с помощью createTempFile

Создайте новый класс «MyHelper». В этом классе мы собираемся изменить размер выбранного пользователем изображения, готового для обработки API распознавания текста.

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

Установите изображение для ImageView

Затем нам нужно реализовать onActivityResult () в нашем классе MainActivity и установить выбранное пользователем изображение в наш ImageView.

импорт android.graphics.Bitmap; импорт android.os.Bundle; import android.widget.ImageView; импорт android.content.Intent; import android.widget.TextView; импорт android.net.Uri; открытый класс MainActivity расширяет BaseActivity {private Bitmap myBitmap; частный ImageView myImageView; приватный TextView myTextView; @Override protected void onCreate (Bundle saveInstanceState) {super.onCreate (сохраненныйInstanceState); setContentView (R.layout.activity_main); myTextView = findViewById (R.id.textView); myImageView = findViewById (R.id.imageView); } @Override protected void onActivityResult (int requestCode, int resultCode, данные намерений) {super.onActivityResult (requestCode, resultCode, data); if (resultCode == RESULT_OK) {switch (requestCode) {case WRITE_STORAGE: checkPermission (requestCode); перемена; case SELECT_PHOTO: Uri dataUri = data.getData (); String path = MyHelper.getPath (this, 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; import android.widget.ImageView; импорт android.content.Intent; import android.widget.TextView; импорт android.view.View; импорт android.net.Uri; открытый класс MainActivity расширяет BaseActivity, реализует View.OnClickListener {private Bitmap myBitmap; частный ImageView myImageView; приватный TextView myTextView; @Override protected void onCreate (Bundle saveInstanceState) {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 (View view) {switch (view.getId ()) {case R.id.checkText: if (myBitmap! = Null) {// Мы будем реализовывать runTextRecog на следующем шаге // runTextRecog (); } перемена; }}

ML Kit может обрабатывать изображения только в формате FirebaseVisionImage, поэтому нам нужно преобразовать наше изображение в объект FirebaseVisionImage. Вы можете создать FirebaseVisionImage из растрового изображения, media.Image, ByteBuffer или байтового массива. Поскольку мы работаем с битмапами, нам нужно вызвать метод утилиты fromBitmap () класса FirebaseVisionImage и передать ему наш битмап.

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

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

Мы создаем экземпляр FirebaseVisionTextDetector, используя getVisionTextDetector:

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

Затем нам нужно проверить FirebaseVisionImage на наличие текста, вызвав метод deteInImage () и передав ему объект FirebaseVisionImage. Нам также необходимо реализовать обратные вызовы onSuccess и onFailure, а также соответствующие прослушиватели, чтобы наше приложение получало уведомления при появлении результатов.

Detector.detectInImage (изображение) .addOnSuccessListener (новый OnSuccessListener() {@Override // To do //}}). AddOnFailureListener (new 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) {// Вызовите processExtractedText с ответом // processExtractedText (тексты); }}). addOnFailureListener (new OnFailureListener () {@Override // Реализация обратного вызова onFailure // public void onFailure (исключение @NonNull Exception) {Toast.makeText (MainActivity.this, «Exception», Toast.LENGTH_LONG) .show ( );}}); }

Всякий раз, когда наше приложение получает уведомление onSuccess, нам нужно проанализировать результаты.

Объект 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); возвращение; } for (FirebaseVisionText.Block block: firebaseVisionText.getBlocks ()) {myTextView.append (block.getText ()); }}}

Вот завершенный код MainActivity:

импорт android.graphics.Bitmap; импорт android.os.Bundle; import android.widget.ImageView; импорт android.content.Intent; import android.widget.TextView; импорт android.widget.Toast; импорт android.view.View; импорт android.net.Uri; импорт 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 расширяет BaseActivity, реализует View.OnClickListener {private Bitmap myBitmap; частный ImageView myImageView; приватный TextView myTextView; @Override protected void onCreate (Bundle saveInstanceState) {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 (View view) {switch (view.getId ()) {case R.id.checkText: if (myBitmap! = Null) {runTextRecog (); } перемена; }} @Override protected void onActivityResult (int requestCode, int resultCode, данные намерений) {super.onActivityResult (requestCode, resultCode, data); if (resultCode == RESULT_OK) {switch (requestCode) {case WRITE_STORAGE: checkPermission (requestCode); перемена; case SELECT_PHOTO: Uri dataUri = data.getData (); String path = MyHelper.getPath (this, dataUri); if (path == null) {myBitmap = MyHelper.resizePhoto (фотография, это, dataUri, myImageView); } else {myBitmap = MyHelper.resizePhoto (фотография, путь, myImageView); } if (myBitmap! = null) {myTextView.setText (null); myImageView.setImageBitmap (MyBitmap); } перемена; }}} private void runTextRecog () {FirebaseVisionImage image = FirebaseVisionImage.fromBitmap (myBitmap); Детектор FirebaseVisionTextDetector = FirebaseVision.getInstance (). GetVisionTextDetector (); Detector.detectInImage (изображение) .addOnSuccessListener (новый OnSuccessListener() {@Override public void onSuccess (тексты FirebaseVisionText) {processExtractedText (тексты); }}). addOnFailureListener (new OnFailureListener () {@Override public void onFailure (исключение @NonNull Exception) {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); возвращение; } for (FirebaseVisionText.Block block: firebaseVisionText.getBlocks ()) {myTextView.append (block.getText ()); }}}

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

Теперь пришло время увидеть распознавание текста ML Kit в действии! Установите этот проект на устройство Android или AVD, выберите изображение из галереи, а затем нажмите кнопку «Проверить текст». Приложение должно ответить, извлекая весь текст из изображения, а затем отображая его в TextView.

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

Вы также можете скачать готовый проект с GitHub.

Завершение

Теперь вы знаете, как обнаружить и извлечь текст из изображения, используя ML Kit.

API распознавания текста является лишь частью ML Kit. Этот SDK также предлагает сканирование штрих-кодов, обнаружение лиц, маркировку изображений и распознавание ориентиров, а также планирует добавить больше API для распространенных случаев использования на мобильных устройствах, включая Smart Reply и API-интерфейс с высокой плотностью контуров лица.

Какой ML Kit API вам больше всего интересно попробовать? Дайте нам знать в комментариях ниже!

> Что такое Google Aitant и какие продукты его используют?Ранее полагаясь на надстройки IFTTT, Google недавно представила встроенную совместимость, чтобы найти ваш телефон с последним обновлением П...

Обновление, 27 февраля, 05:30 утра по восточному времени:Компания Alphabet, материнская компания Google, заявляет, что устройства Google Home не будут получать поддержку Apple Muic, следуя слухам, поя...

Мы советуем