Бөлісу құралы:


Vision Framework в Xamarin.iOS

Платформа Визуального зрения добавляет ряд новых функций обработки изображений в iOS 11, в том числе:

  • Обнаружение прямоугольника
  • Обнаружение лиц
  • анализ изображений Машинное обучение (обсуждается в CoreML)
  • Обнаружение штрихкодов
  • Анализ выравнивания изображений
  • Распознавание текста
  • Обнаружение горизонта
  • Обнаружение объектов и отслеживание

Фотография с тремя прямоугольниками обнаружена. Фотография с двумя лицами обнаружена.

Обнаружение прямоугольников и обнаружение лиц рассматриваются более подробно ниже.

Обнаружение прямоугольника

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

1. Инициализация запроса визуального зрения

Создайте ViewDidLoadVNDetectRectanglesRequest HandleRectangles метод, который будет вызываться в конце каждого запроса:

Свойство MaximumObservations также должно быть задано, в противном случае оно по умолчанию будет иметь значение 1, и будет возвращен только один результат.

RectangleRequest = new VNDetectRectanglesRequest(HandleRectangles);
RectangleRequest.MaximumObservations = 10;

2. Запуск обработки визуального зрения

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

// Run the rectangle detector
var handler = new VNImageRequestHandler(ciImage, uiImage.Orientation.ToCGImagePropertyOrientation(), new VNImageOptions());
DispatchQueue.DefaultGlobalQueue.DispatchAsync(()=>{
  handler.Perform(new VNRequest[] {RectangleRequest}, out NSError error);
});

Этот обработчик передает платформу ciImage VNDetectRectanglesRequest Визуального зрения, созданную на шаге 1.

3. Обработка результатов обработки визуального зрения

После завершения обнаружения прямоугольника платформа выполняет HandleRectangles метод, сводка из которого показана ниже:

private void HandleRectangles(VNRequest request, NSError error){
  var observations = request.GetResults<VNRectangleObservation>();
  // ... omitted error handling ...
  bool atLeastOneValid = false;
  foreach (var o in observations){
    if (InputImage.Extent.Contains(boundingBox)) {
      atLeastOneValid |= true;
    }
  }
  if (!atLeastOneValid) return;
  // Show the pre-processed image
  DispatchQueue.MainQueue.DispatchAsync(() =>
  {
    ClassificationLabel.Text = summary;
    ImageView.Image = OverlayRectangles(RawImage, imageSize, observations);
  });
}

4. Отображение результатов

Метод OverlayRectangles в примере VisionRectangles имеет три функции:

  • Отрисовка исходного изображения,
  • Рисование прямоугольника, указывающее, где обнаружен каждый из них, и
  • Добавление текстовой метки для каждого прямоугольника с помощью CoreGraphics.

Фотография с тремя прямоугольниками, обнаруженными на мобильном устройстве.

5. Дальнейшая обработка

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

Обнаружение лиц

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

1. Инициализация запроса визуального зрения

Создайте ViewDidLoadVNDetectFaceRectanglesRequest HandleRectangles метод, который будет вызываться в конце каждого запроса.

FaceRectangleRequest = new VNDetectFaceRectanglesRequest(HandleRectangles);

2. Запуск обработки визуального зрения

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

// Run the face detector
var handler = new VNImageRequestHandler(ciImage, uiImage.Orientation.ToCGImagePropertyOrientation(), new VNImageOptions());
DispatchQueue.DefaultGlobalQueue.DispatchAsync(()=>{
  handler.Perform(new VNRequest[] {FaceRectangleRequest}, out NSError error);
});

Этот обработчик передает платформу ciImage VNDetectFaceRectanglesRequest Визуального зрения, созданную на шаге 1.

3. Обработка результатов обработки визуального зрения

После завершения обнаружения лиц обработчик выполняет HandleRectangles метод, который выполняет обработку ошибок и отображает границы обнаруженных лиц, и вызывает OverlayRectangles ограничивающие прямоугольники на исходном рисунке:

private void HandleRectangles(VNRequest request, NSError error){
  var observations = request.GetResults<VNFaceObservation>();
  // ... omitted error handling...
  var summary = "";
  var imageSize = InputImage.Extent.Size;
  bool atLeastOneValid = false;
  Console.WriteLine("Faces:");
  summary += "Faces:";
  foreach (var o in observations) {
    // Verify detected rectangle is valid. omitted
    var boundingBox = o.BoundingBox.Scaled(imageSize);
    if (InputImage.Extent.Contains(boundingBox)) {
      atLeastOneValid |= true;
    }
  }
  // Show the pre-processed image (on UI thread)
  DispatchQueue.MainQueue.DispatchAsync(() =>
  {
    ClassificationLabel.Text = summary;
    ImageView.Image = OverlayRectangles(RawImage, imageSize, observations);
  });
}

4. Отображение результатов

Метод OverlayRectangles в примере VisionFaces имеет три функции:

  • Отрисовка исходного изображения,
  • Рисование прямоугольника для каждого обнаруженного лица и
  • Добавление текстовой метки для каждого лица с помощью CoreGraphics.

Фотография с двумя лицами, обнаруженными на мобильном устройстве.

5. Дальнейшая обработка

Платформа визуального распознавания включает дополнительные возможности для обнаружения признаков лица, таких как глаза и рот. Используйте тип, который вернет VNFaceObservation результаты, как показано на шаге VNDetectFaceLandmarksRequest 3 выше, но с дополнительными VNFaceLandmark данными.