Vision Framework in Xamarin.iOS

Il framework Vision aggiunge una serie di nuove funzionalità di elaborazione delle immagini a iOS 11, tra cui:

  • Rilevamento rettangolo
  • Rilevamento viso
  • Analisi delle immagini di Machine Learning (descritta in CoreML)
  • Rilevamento codice a barre
  • Analisi dell'allineamento delle immagini
  • Rilevamento testo
  • Rilevamento dell'orizzonte
  • Rilevamento oggetti e rilevamento

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

Il rilevamento dei rettangoli e il rilevamento dei volti sono descritti in modo più dettagliato di seguito.

Rilevamento rettangolo

L'esempio VisionRects mostra come elaborare un'immagine e disegnare i rettangoli rilevati.

1. Inizializzare la richiesta di visione

In ViewDidLoadcreare un oggetto VNDetectRectanglesRequest che fa riferimento al HandleRectangles metodo che verrà chiamato alla fine di ogni richiesta:

La proprietà deve essere impostata anche. In MaximumObservations caso contrario, per impostazione predefinita verrà restituito 1 e verrà restituito un solo risultato.

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

2. Avviare l'elaborazione della visione

Il codice seguente avvia l'elaborazione della richiesta. Nell'esempio VisionRects questo codice viene eseguito dopo che l'utente ha selezionato un'immagine:

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

Questo gestore passa l'oggetto ciImage al framework VNDetectRectanglesRequest vision creato nel passaggio 1.

3. Gestire i risultati dell'elaborazione della visione

Al termine del rilevamento del rettangolo, il framework esegue il HandleRectangles metodo , un riepilogo del quale è illustrato di seguito:

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. Visualizzare i risultati

Il OverlayRectangles metodo nell'esempio VisionRectangles ha tre funzioni:

  • Rendering dell'immagine di origine,
  • Disegno di un rettangolo per indicare dove è stato rilevato ogni rettangolo e
  • Aggiunta di un'etichetta di testo per ogni rettangolo tramite CoreGraphics.

Visualizzare l'origine dell'esempio per il metodo CoreGraphics esatto.

Photograph with three rectangles detected on a mobile device.

5. Ulteriore elaborazione

Il rilevamento del rettangolo è spesso solo il primo passaggio di una catena di operazioni, ad esempio con questo esempio CoreMLVision, in cui i rettangoli vengono passati a un modello CoreML per analizzare le cifre scritte a mano.

Rilevamento viso

L'esempio VisionFaces funziona in modo simile all'esempio VisionRectangles, usando una classe di richiesta Visione diversa.

1. Inizializzare la richiesta di visione

In ViewDidLoadcreare un oggetto VNDetectFaceRectanglesRequest che fa riferimento al HandleRectangles metodo che verrà chiamato alla fine di ogni richiesta.

FaceRectangleRequest = new VNDetectFaceRectanglesRequest(HandleRectangles);

2. Avviare l'elaborazione della visione

Il codice seguente avvia l'elaborazione della richiesta. Nell'esempio VisionFaces questo codice viene eseguito dopo che l'utente ha selezionato un'immagine:

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

Questo gestore passa l'oggetto ciImage al framework VNDetectFaceRectanglesRequest vision creato nel passaggio 1.

3. Gestire i risultati dell'elaborazione della visione

Al termine del rilevamento del viso, il gestore esegue il metodo che esegue la HandleRectangles gestione degli errori e visualizza i limiti dei visi rilevati e chiama per OverlayRectangles disegnare rettangoli di delimitazione sull'immagine originale:

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. Visualizzare i risultati

Il OverlayRectangles metodo nell'esempio VisionFaces ha tre funzioni:

  • Rendering dell'immagine di origine,
  • Disegno di un rettangolo per ogni viso rilevato e
  • Aggiunta di un'etichetta di testo per ogni viso tramite CoreGraphics.

Visualizzare l'origine dell'esempio per il metodo CoreGraphics esatto.

Photograph with two faces detected on a mobile device.

5. Ulteriore elaborazione

Il framework vision include funzionalità aggiuntive per rilevare le caratteristiche del viso, ad esempio gli occhi e la bocca. Usare il VNDetectFaceLandmarksRequest tipo , che restituirà VNFaceObservation i risultati come nel passaggio 3 precedente, ma con dati aggiuntivi VNFaceLandmark .