Вступление

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

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

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

Здесь мы узнаем, как извлечь пользователя из изображения, изменить его фон и создать новый замечательный результат с помощью Huawei ML Kit.

Я разделю этот процесс на 4 этапа

1. Как выбрать изображение из галереи или камеры

2. Как только мы получим результат, как отправить его в Huawei ML Kit

3. Как завершить обработку изображения с желаемым результатом.

4. Как вывести на экран только что извлеченное изображение.

Вот пример изображения и его окончательный результат.

Вы заметили, как легко выбрать изображение и изменить его фон по нашему выбору.

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

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

Итак, перейдем к делу

Шаг 1:

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

По камере:

По галерее:

Шаг 2:

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

Управление снова возвращается к нашему ImageSegmentActivity в методе onActivityResult.

Мы должны получить растровое изображение и сохранить его для использования в будущем. Ниже приведен код для справки.

Шаг 3:

После получения растрового изображения я устанавливаю MutableLiveData, который присутствует в моем ImageSegmentationViewModel, и вызываю метод imageSegmentation ().

Давайте подробно обсудим использованную выше строку кода

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

После создания этого объекта MLImageSegmentationSetting для настройки мы передадим его в MLImageSegmentationAnalyzer.

  • setExact (False): True - если требуется точная сегментация, а False - быстрая сегментация.
  • setAnalyzerType (MLImageSegmentationSetting.BODY_SEG): установка режима для идентификации и извлечения тела из изображения.
  • setScene (MLImageSegmentationScene.ALL): В целом мы можем извлечь 4 сцены из изображения, которые также указаны ниже, с их ключом.
  1. MLImageSegmentationScene.ALL: Возвращаются все результаты сегментации (информация о метках на уровне пикселей, изображение человеческого тела с прозрачным фоном и изображение в градациях серого с белым человеческим телом и черным фоном).
  2. MLImageSegmentationScene.MASK_ONLY: возвращается только информация о метках на уровне пикселей.
  3. MLImageSegmentationScene.FOREGROUND_ONLY: возвращается только изображение человеческого тела с прозрачным фоном.
  4. MLImageSegmentationScene.GRAYSCALE_ONLY: возвращается только изображение в оттенках серого с белым человеческим телом и черным фоном.

В нашем примере мы используем MLImageSegmentationScene.ALL, так как нам нужны все сцены изображения.

Наконец, созданный выше объект MLImageSegmentationSetting, который мы предоставим MLImageSegmentationAnalyzer

  • MLImageSegmentationAnalyzer analyzer = MLAnalyzerFactory.getInstance (). getImageSegmentationAnalyzer (настройка);

Мы также можем создать объект MLImageSegmentationAnalyzer, также вызвав приведенный ниже код.

  • MLImageSegmentationAnalyzer analyzer = MLAnalyzerFactory.getInstance (). getImageSegmentationAnalyzer ();

Но в этом коде настройка очень ограничена.

Следующим шагом является создание MLFrame с помощью приведенного ниже кода и представление ранее полученного изображения в формате растрового изображения.

  • кадр MLFrame = MLFrame.fromBitmap (растровое изображение);

В объекте анализатора мы будем вызывать asyncAnalyseFrame (frame) и предоставлять недавно созданный MLFrame.

Это даст вам объект Task ‹MLImageSegmentation›, для этого объекта вы получите 2 обратных вызова.

  • onSuccess
  • onFailure

Вы можете сохранить новый ресурс из onSuccess () и остановить анализатор, чтобы освободить ресурсы обнаружения с помощью метода analyzer.stop ().

Шаг 4:

Вот как мы можем установить растровое изображение для просмотра изображений

  • Внутри нашего основного макета была добавлена ​​модель представления с именем dashboardViewModel.
  • Мы также добавили специальный тег под названием customImageSrc.
  • Мы создали класс адаптера с именем CustomImageAdapter, в котором мы привязываем наш ImageView к тегу @BindingAdapter («customImageSrc»).
  • Как только наши изменяемые живые данные будут обновлены в ViewModel в результате успешного обратного вызова из Задачи ‹MLImageSegmentation›
  • BindingAdapter автоматически обновит это изображение.

Конечный результат

Заключение

Надеюсь, вам понравилась эта статья. Я хотел бы услышать ваши идеи о том, как вы можете использовать этот комплект в своих приложениях.

Если у вас нет настоящего устройства, вы можете прочитать эту статью.



Для практики code-labs посетите здесь