Estrutura de visão no Xamarin.iOS

A estrutura Vision adiciona uma série de novos recursos de processamento de imagem ao iOS 11, incluindo:

  • Detecção de retângulos
  • Detecção de Rosto
  • Análise de Imagem de Aprendizado de Máquina (discutida em CoreML)
  • Detecção de código de barras
  • Análise de alinhamento de imagem
  • Detecção de Texto
  • Detecção de Horizonte
  • Detecção de objetos e rastreamento

Photograph with three rectangles detected.Photograph with two faces detected.

A Detecção de Retângulos e a Detecção de Rosto são discutidas em mais detalhes abaixo.

Detecção de retângulos

O exemplo VisionRects mostra como processar uma imagem e desenhar os retângulos detectados nela.

1. Inicialize a solicitação de Visão

No ViewDidLoad, crie um VNDetectRectanglesRequest que faça referência ao HandleRectangles método que será chamado no final de cada solicitação:

A MaximumObservations propriedade também deve ser definida, caso contrário, o padrão será 1 e apenas um único resultado será retornado.

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

2. Inicie o processamento da Visão

O código a seguir inicia o processamento da solicitação. No exemplo VisionRects, esse código é executado depois que o usuário seleciona uma imagem:

// 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);
});

Esse manipulador passa o ciImage para a estrutura VNDetectRectanglesRequest Vision que foi criada na etapa 1.

3. Lidar com os resultados do processamento da visão

Uma vez que a detecção do retângulo esteja completa, a estrutura executa o HandleRectangles método, cujo resumo é mostrado abaixo:

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. Exibir os resultados

O OverlayRectangles método no exemplo VisionRectangles tem três funções:

  • Renderizando a imagem de origem,
  • Desenhar um retângulo para indicar onde cada um foi detectado, e
  • Adicionando um rótulo de texto para cada retângulo usando CoreGraphics.

Exiba a origem do exemplo para o método CoreGraphics exato.

Photograph with three rectangles detected on a mobile device.

5. Processamento posterior

A detecção de retângulos geralmente é apenas a primeira etapa de uma cadeia de operações, como neste exemplo de CoreMLVision, em que os retângulos são passados para um modelo CoreML para analisar dígitos manuscritos.

Detecção Facial

O exemplo VisionFaces funciona de maneira semelhante ao exemplo VisionRectangles, usando uma classe de solicitação Vision diferente.

1. Inicialize a solicitação de Visão

No ViewDidLoad, crie um VNDetectFaceRectanglesRequest que faça referência ao HandleRectangles método que será chamado no final de cada solicitação.

FaceRectangleRequest = new VNDetectFaceRectanglesRequest(HandleRectangles);

2. Inicie o processamento da Visão

O código a seguir inicia o processamento da solicitação. No exemplo do VisionFaces, esse código é executado depois que o usuário seleciona uma imagem:

// 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);
});

Esse manipulador passa o ciImage para a estrutura VNDetectFaceRectanglesRequest Vision que foi criada na etapa 1.

3. Lidar com os resultados do processamento da visão

Quando a detecção de faces estiver concluída, o manipulador executa o método que executa o tratamento de erros e exibe os limites das faces detectadas, e chama o HandleRectanglesOverlayRectangles para desenhar retângulos delimitadores na imagem original:

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. Exibir os resultados

O OverlayRectangles método no exemplo VisionFaces tem três funções:

  • Renderizando a imagem de origem,
  • Desenhar um retângulo para cada face detectada, e
  • Adicionar um rótulo de texto para cada face usando CoreGraphics.

Exiba a origem do exemplo para o método CoreGraphics exato.

Photograph with two faces detected on a mobile device.

5. Processamento posterior

A estrutura Vision inclui recursos adicionais para detectar características faciais, como olhos e boca. Use o VNDetectFaceLandmarksRequest tipo, que retornará VNFaceObservation resultados como na etapa 3 acima, mas com dados adicionais VNFaceLandmark .