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
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
ViewDidLoad
Erstellen 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.
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
ViewDidLoad
Erstellen 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.
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
.