Kernimage in Xamarin.iOS

Core Image ist ein neues Framework, das mit iOS 5 eingeführt wurde, um Bildverarbeitungs- und Livevideoverbesserungsfunktionen bereitzustellen. In diesem Artikel werden diese Features mit Xamarin.iOS-Beispielen vorgestellt.

Core Image ist ein neues Framework, das in iOS 5 eingeführt wurde und eine Reihe von integrierten Filtern und Effekten bietet, die auf Bilder und Videos angewendet werden können, einschließlich der Gesichtserkennung.

Dieses Dokument enthält einfache Beispiele für:

  • Gesichtserkennung.
  • Anwenden von Filtern auf ein Bild
  • Auflisten der verfügbaren Filter.

Diese Beispiele sollen Ihnen den Einstieg in die Integration von Core Image-Features in Ihre Xamarin.iOS-Anwendungen erleichtern.

Anforderungen

Sie müssen die neueste Version von Xcode verwenden.

Gesichtserkennung

Die Gesichtserkennungsfunktion "Kernbild" macht genau das, was es sagt: Es versucht, Gesichter in einem Foto zu identifizieren, und gibt die Koordinaten aller Gesichter zurück, die es erkennt. Diese Informationen können verwendet werden, um die Anzahl der Personen in einem Bild zu zählen, Indikatoren auf dem Bild zu zeichnen (z. B. zum "Markieren" von Personen in einem Foto) oder alles andere, was Sie sich vorstellen können.

Dieser Code aus CoreImage\SampleCode.cs veranschaulicht, wie Die Gesichtserkennung für ein eingebettetes Bild erstellt und verwendet wird:

var image = new UIImage("photoFace.JPG");
var context = CIContext.FromOptions(null);
var detector = CIDetector.CreateFaceDetector (context, true);
var ciImage = CIImage.FromCGImage(image.CGImage);
CIFeature[] features = detector.FeaturesInImage(ciImage);

Das Featurearray wird mit CIFaceFeature Objekten aufgefüllt (wenn Gesichter erkannt wurden). Für jedes Gesicht gibt es eine CIFaceFeature . CIFaceFeature weist die folgenden Eigenschaften auf:

  • HasMouthPosition – Ob für dieses Gesicht ein Mund erkannt wurde.
  • HasLeftEyePosition – Gibt an, ob das linke Auge für dieses Gesicht erkannt wurde.
  • HasRightEyePosition – Gibt an, ob das rechte Auge für dieses Gesicht erkannt wurde.
  • MouthPosition – Die Koordinaten des Mundes für dieses Gesicht.
  • LeftEyePosition – Die Koordinaten des linken Auges für dieses Gesicht.
  • RightEyePosition – Die Koordinaten des rechten Auges für dieses Gesicht.

Die Koordinaten für alle diese Eigenschaften haben ihren Ursprung in der unteren linken Ecke – im Gegensatz zu UIKit, das die obere linke Als Ursprung verwendet. Wenn Sie die Koordinaten ein CIFaceFeature verwenden, stellen Sie sicher, dass Sie sie "umdrehen". In dieser sehr einfachen benutzerdefinierten Bildansicht in CoreImage\CoreImageViewController.cs wird veranschaulicht, wie "Gesichtsindikator"-Dreiecke auf dem Bild gezeichnet werden (beachten Sie die FlipForBottomOrigin -Methode):

public class FaceDetectImageView : UIView
{
    public Xamarin.iOS.CoreImage.CIFeature[] Features;
    public UIImage Image;
    public FaceDetectImageView (RectangleF rect) : base(rect) {}
    CGPath path;
    public override void Draw (RectangleF rect) {
        base.Draw (rect);
        if (Image != null)
            Image.Draw(rect);

        using (var context = UIGraphics.GetCurrentContext()) {
            context.SetLineWidth(4);
            UIColor.Red.SetStroke ();
            UIColor.Clear.SetFill ();
            if (Features != null) {
                foreach (var feature in Features) { // for each face
                    var facefeature = (CIFaceFeature)feature;
                    path = new CGPath ();
                    path.AddLines(new PointF[]{ // assumes all 3 features found
                        FlipForBottomOrigin(facefeature.LeftEyePosition, 200),
                        FlipForBottomOrigin(facefeature.RightEyePosition, 200),
                        FlipForBottomOrigin(facefeature.MouthPosition, 200)
                    });
                    path.CloseSubpath();
                    context.AddPath(path);
                    context.DrawPath(CGPathDrawingMode.FillStroke);
                }
            }
        }
    }
    /// <summary>
    /// Face recognition coordinates have their origin in the bottom-left
    /// but we are drawing with the origin in the top-left, so "flip" the point
    /// </summary>
    PointF FlipForBottomOrigin (PointF point, int height)
    {
        return new PointF(point.X, height - point.Y);
    }
}

Anschließend werden in der Datei SampleCode.cs das Image und die Features zugewiesen, bevor das Bild neu gezeichnet wird:

faceView.Image = image;
faceView.Features = features;
faceView.SetNeedsDisplay();

Der Screenshot zeigt die Beispielausgabe: Die Speicherorte der erkannten Gesichtsfeatures werden in einer UITextView angezeigt und mithilfe von CoreGraphics auf das Quellbild gezeichnet.

Aufgrund der Funktionsweise der Gesichtserkennung erkennt sie gelegentlich Dinge außer menschlichen Gesichtern (wie diese Spielzeugaffen!).

Filter

Es gibt über 50 verschiedene integrierte Filter, und das Framework ist erweiterbar, sodass neue Filter implementiert werden können.

Verwenden von Filtern

Das Anwenden eines Filters auf ein Bild umfasst vier verschiedene Schritte: Laden des Bilds, Erstellen des Filters, Anwenden des Filters und Speichern (oder Anzeigen) des Ergebnisses.

Laden Sie zunächst ein Bild in ein CIImage -Objekt.

var uiimage = UIImage.FromFile ("photo.JPG");
var ciimage = new CIImage (uiimage);

Erstellen Sie anschließend die Filterklasse, und legen Sie deren Eigenschaften fest.

var sepia = new CISepiaTone();
sepia.Image = ciimage;
sepia.Intensity = 0.8f;

Drittens: Greifen Sie auf die OutputImage -Eigenschaft zu, und rufen Sie die CreateCGImage -Methode auf, um das Endergebnis zu rendern.

CIImage output = sepia.OutputImage;
var context = CIContext.FromOptions(null);
var cgimage = context.CreateCGImage (output, output.Extent);

Weisen Sie schließlich das Bild einer Ansicht zu, um das Ergebnis anzuzeigen. In einer realen Anwendung kann das resultierende Bild im Dateisystem, im Fotoalbum, in einem Tweet oder in einer E-Mail gespeichert werden.

var ui = UIImage.FromImage (cgimage);
imgview.Image = ui;

Diese Screenshots zeigen das Ergebnis der CISepia Filter und CIHueAdjust , die im CoreImage.zip Beispielcode veranschaulicht werden.

Ein Beispiel für den Filter finden Sie unter Anpassen von Vertrag und Helligkeit eines BildrezeptsCIColorControls.

var uiimage = UIImage.FromFile("photo.JPG");
var ciimage = new CIImage(uiimage);
var hueAdjust = new CIHueAdjust();   // first filter
hueAdjust.Image = ciimage;
hueAdjust.Angle = 2.094f;
var sepia = new CISepiaTone();       // second filter
sepia.Image = hueAdjust.OutputImage; // output from last filter, input to this one
sepia.Intensity = 0.3f;
CIFilter color = new CIColorControls() { // third filter
    Saturation = 2,
    Brightness = 1,
    Contrast = 3,
    Image = sepia.OutputImage    // output from last filter, input to this one
};
var output = color.OutputImage;
var context = CIContext.FromOptions(null);
// ONLY when CreateCGImage is called do all the effects get rendered
var cgimage = context.CreateCGImage (output, output.Extent);
var ui = UIImage.FromImage (cgimage);
imgview.Image = ui;
var context = CIContext.FromOptions (null);
var context = CIContext.FromOptions(new CIContextOptions() {
    UseSoftwareRenderer = true  // CPU
});
var cgimage = context.CreateCGImage (output, output.Extent);
var ui = UIImage.FromImage (cgimage);
imgview.Image = ui;

Auflisten von Filtern und deren Eigenschaften

Dieser Code aus CoreImage\SampleCode.cs gibt die vollständige Liste der integrierten Filter und deren Parameter aus.

var filters = CIFilter.FilterNamesInCategories(new string[0]);
foreach (var filter in filters){
   display.Text += filter +"\n";
   var f = CIFilter.FromName (filter);
   foreach (var key in f.InputKeys){
     var attributes = (NSDictionary)f.Attributes[new NSString(key)];
     var attributeClass = attributes[new NSString("CIAttributeClass")];
     display.Text += "   " + key;
     display.Text += "   " + attributeClass + "\n";
   }
}

Die CIFilter-Klassenreferenz beschreibt die 50 integrierten Filter und ihre Eigenschaften. Mithilfe des obigen Codes können Sie die Filterklassen abfragen, einschließlich der Standardwerte für Parameter und der maximalen und minimal zulässigen Werte (die verwendet werden können, um Eingaben vor dem Anwenden eines Filters zu überprüfen).

Die Ausgabe Listenkategorien sieht im Simulator wie folgt aus. Sie können durch die Liste scrollen, um alle Filter und deren Parameter anzuzeigen.

Die Ausgabe Listenkategorien sieht im Simulator wie folgt aus.

Jeder aufgelistete Filter wurde als Klasse in Xamarin.iOS verfügbar gemacht, sodass Sie die Xamarin.iOS.CoreImage-API auch im Assemblybrowser oder mithilfe der automatischen Vervollständigung in Visual Studio für Mac oder Visual Studio erkunden können.

Zusammenfassung

In diesem Artikel wurde gezeigt, wie Sie einige der neuen Features des iOS 5 Core Image Frameworks wie Gesichtserkennung und Anwenden von Filtern auf ein Bild verwenden. Es gibt Dutzende von verschiedenen Bildfiltern im Framework, die Sie verwenden können.