Freigeben über


Vision Framework in Xamarin.iOS

Das Vision-Framework fügt eine Reihe neuer Bildverarbeitungsfeatures zu iOS 11 hinzu, darunter:

  • Rechteckerkennung
  • Gesichtserkennung
  • Machine Learning Image Analysis (erläutert in CoreML)
  • Barcodeerkennung
  • Analyse der Bildausrichtung
  • Texterkennung
  • Horizonterkennung
  • Objekterkennung und -verfolgung

Foto mit drei erkannten Rechtecke.Foto mit zwei Gesichtern erkannt.

Rechteckerkennung und Gesichtserkennung werden unten ausführlicher erläutert.

Rechteckerkennung

Das Beispiel zeigt, wie Sie ein Bild verarbeiten und die erkannten Rechtecke darauf zeichnen.

1. Initialisieren der Vision-Anforderung

ViewDidLoadErstellen Sie in , eineVNDetectRectanglesRequest, die auf die HandleRectangles Methode verweist, die am Ende jeder Anforderung aufgerufen wird:

Die MaximumObservations Eigenschaft sollte auch festgelegt werden, andernfalls wird standardmäßig 1 verwendet, und nur ein einzelnes Ergebnis wird zurückgegeben.

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

2. Starten der Vision-Verarbeitung

Der folgende Code beginnt mit der Verarbeitung der Anforderung. Im VisionRects-Beispiel wird dieser Code ausgeführt, nachdem der Benutzer ein Bild ausgewählt hat:

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

Dieser Handler übergibt das ciImage Vision-Framework VNDetectRectanglesRequest , das in Schritt 1 erstellt wurde.

3. Behandeln der Ergebnisse der Vision-Verarbeitung

Sobald die Rechteckerkennung abgeschlossen ist, führt das Framework die HandleRectangles Methode aus, deren Zusammenfassung unten dargestellt wird:

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. Anzeigen der Ergebnisse

Die OverlayRectangles Methode im Beispiel "VisionRectangles" hat drei Funktionen:

  • Rendern des Quellbilds,
  • Zeichnen eines Rechtecks, um anzugeben, wo jedes Rechteck erkannt wurde, und
  • Hinzufügen einer Textbezeichnung für jedes Rechteck mithilfe von CoreGraphics.

Fotografie mit drei Rechtecke, die auf einem mobilen Gerät erkannt wurden.

5. Weitere Verarbeitung

Die Rechteckerkennung ist häufig nur der erste Schritt in einer Kette von Vorgängen, z. B. bei diesem CoreMLVision-Beispiel, bei dem die Rechtecke an ein CoreML-Modell übergeben werden, um handschriftliche Ziffern zu analysieren.

Gesichtserkennung

Dieses Beispiel funktioniert ähnlich wie das VisionRectangles-Beispiel mit einer anderen Vision-Anforderungsklasse .

1. Initialisieren der Vision-Anforderung

ViewDidLoadErstellen Sie in , eineVNDetectFaceRectanglesRequest, die auf die HandleRectangles Methode verweist, die am Ende jeder Anforderung aufgerufen wird.

FaceRectangleRequest = new VNDetectFaceRectanglesRequest(HandleRectangles);

2. Starten der Vision-Verarbeitung

Der folgende Code beginnt mit der Verarbeitung der Anforderung. Im VisionFaces-Beispiel wird dieser Code ausgeführt, nachdem der Benutzer ein Bild ausgewählt hat:

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

Dieser Handler übergibt das ciImage Vision-Framework VNDetectFaceRectanglesRequest , das in Schritt 1 erstellt wurde.

3. Behandeln der Ergebnisse der Vision-Verarbeitung

Sobald die Gesichtserkennung abgeschlossen ist, führt der Handler die HandleRectangles Methode aus, die fehlerbehandlung durchführt, und zeigt die Grenzen der erkannten Gesichter an und ruft die OverlayRectangles umgebenden Rechtecke für das ursprüngliche Bild auf:

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. Anzeigen der Ergebnisse

Die OverlayRectangles Methode im Beispiel "VisionFaces" hat drei Funktionen:

  • Rendern des Quellbilds,
  • Zeichnen eines Rechtecks für jede erkannte Oberfläche und
  • Hinzufügen einer Textbezeichnung für jedes Gesicht mithilfe von CoreGraphics.

Foto mit zwei Gesichtern, die auf einem mobilen Gerät erkannt wurden.

5. Weitere Verarbeitung

Das Vision-Framework enthält zusätzliche Funktionen zum Erkennen von Gesichtsmerkmalen wie Augen und Mund. Verwenden Sie den VNDetectFaceLandmarksRequest Typ, der Ergebnisse wie in Schritt 3 oben, aber mit zusätzlichen VNFaceLandmark Daten zurückgibtVNFaceObservation.