Estrutura de visão no Xamarin.iOS

A estrutura Vision adiciona vários novos recursos de processamento de imagem ao iOS 11, incluindo:

  • Detecção de retângulo
  • 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 e rastreamento de objetos

Fotografia com três retângulos detectados. Fotografia com dois rostos detectados.

A detecção de retângulo e a detecção de rosto são discutidas com mais detalhes abaixo.

Detecção de retângulo

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

1. Inicialize a solicitação do Vision

Em 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

Quando a detecção do retângulo é concluída, 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. Exiba 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.

Fotografia com três retângulos detectados em um dispositivo móvel.

5. Processamento posterior

A detecção de retângulo geralmente é apenas a primeira etapa em 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

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

1. Inicialize a solicitação do Vision

Em 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 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

Depois que a detecção de rosto é concluída, o manipulador executa o HandleRectangles método que executa o tratamento de erros e exibe os limites dos rostos detectados e chama o OverlayRectangles 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. Exiba 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
  • Adicionando um rótulo de texto para cada face usando CoreGraphics.

Fotografia com dois rostos detectados em um dispositivo móvel.

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 .