Sdílet prostřednictvím


Základní image v Xamarin.iOS

Core Image je nová architektura zavedená v iOSu 5, která poskytuje funkce pro zpracování obrázků a vylepšení živého videa. Tento článek představuje tyto funkce s ukázkami Xamarin.iOS.

Core Image je nová architektura zavedená v iOSu 5, která poskytuje řadu předdefinovaných filtrů a efektů, které se použijí na obrázky a videa, včetně detekce tváří.

Tento dokument obsahuje jednoduché příklady:

  • Rozpoznávání tváře.
  • Použití filtrů na obrázek
  • Výpis dostupných filtrů

Tyto příklady by vám měly pomoct začít začlenit funkce Core Image do aplikací Xamarin.iOS.

Požadavky

Musíte použít nejnovější verzi Xcode.

Detekce obličeje

Funkce rozpoznávání tváře Core Image dělá přesně to, co říká – snaží se identifikovat tváře na fotce a vrací souřadnice všech tváří, které rozpozná. Tyto informace se dají použít k počítání počtu lidí na obrázku, kreslení indikátorů na obrázku (např. označení lidí na fotografii) nebo čehokoli jiného, co si můžete představit.

Tento kód z CoreImage\SampleCode.cs ukazuje, jak vytvořit a používat detekci tváří na vloženém obrázku:

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

Pole funkcí se naplní CIFaceFeature objekty (pokud byly zjištěny nějaké tváře). Pro každou tvář existuje CIFaceFeature jedna tvář. CIFaceFeature má následující vlastnosti:

  • HasMouthPosition – zda byla pro tuto tvář zjištěna ústa.
  • HasLeftEyePosition – zda levé oko bylo zjištěno pro tuto tvář.
  • HasRightEyePosition – zda bylo zjištěno správné oko pro tuto tvář.
  • MouthPosition – souřadnice úst pro tuto tvář.
  • LeftEyePosition – souřadnice levého oka pro tuto tvář.
  • RightEyePosition – souřadnice pravého oka pro tuto tvář.

Souřadnice všech těchto vlastností mají svůj původ v levém dolním rohu – na rozdíl od UIKitu, který jako původ používá levý horní okraj. Při použití souřadnic CIFaceFeature nezapomeňte je překlopit. Toto velmi základní vlastní zobrazení obrázků v CoreImage\CoreImageViewController.cs ukazuje, jak na obrázku nakreslit trojúhelníky indikátoru tváře (všimněte si FlipForBottomOrigin metody):

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

Potom se v SampleCode.cs souboru obrázek a funkce přiřadí před překreslením obrázku:

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

Snímek obrazovky ukazuje ukázkový výstup: umístění rozpoznaných obličejových funkcí se zobrazí v UITextView a nakreslí se na zdrojový obrázek pomocí CoreGraphics.

Vzhledem k tomu, jak rozpoznávání obličeje funguje, občas rozpozná věci kromě lidských tváří (jako jsou tyto opice!).

Filtry

Existuje více než 50 různých předdefinovaných filtrů a architektura je rozšiřitelná tak, aby bylo možné implementovat nové filtry .

Použití filtrů

Použití filtru na obrázek má čtyři různé kroky: načtení obrázku, vytvoření filtru, použití filtru a uložení (nebo zobrazení) výsledku.

Nejprve načtěte obrázek do objektu CIImage .

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

Za druhé vytvořte třídu filtru a nastavte její vlastnosti.

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

Za třetí, přístup k OutputImage vlastnosti a volání CreateCGImage metody vykreslit konečný výsledek.

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

Nakonec přiřaďte obrázek k zobrazení, aby se zobrazil výsledek. Ve skutečné aplikaci může být výsledný obrázek uložen do systému souborů, fotoalbum, tweetu nebo e-mailu.

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

Tyto snímky obrazovky ukazují výsledek CISepia a CIHueAdjust filtry, které jsou demonstrované v ukázkovém kódu CoreImage.zip.

Příklad filtru najdete v tématu Úprava kontraktu a jasu obrázkového receptuCIColorControls.

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;

Výpis filtrů a jejich vlastností

Tento kód z CoreImage\SampleCode.cs výstupem je úplný seznam předdefinovaných filtrů a jejich parametrů.

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";
   }
}

Referenční dokumentace třídy CIFilter popisuje 50 předdefinovaných filtrů a jejich vlastností. Pomocí výše uvedeného kódu můžete dotazovat třídy filtru, včetně výchozích hodnot parametrů a maximálních a minimálních povolených hodnot (které lze použít k ověření vstupů před použitím filtru).

Výstup Kategorie seznamu vypadá takto v simulátoru – v seznamu můžete zobrazit všechny filtry a jejich parametry.

Výstup Kategorie seznamu vypadá takto v simulátoru.

Každý uvedený filtr je v Xamarin.iOS vystavený jako třída, takže můžete také prozkoumat rozhraní API Xamarin.iOS.CoreImage v prohlížeči sestavení nebo pomocí automatického dokončování v Visual Studio pro Mac nebo v sadě Visual Studio.

Shrnutí

Tento článek ukazuje, jak používat některé z nových funkcí architektury iOS 5 Core Image, jako je detekce tváří a použití filtrů na obrázek. V rámci architektury jsou k dispozici desítky různých filtrů obrázků, které můžete použít.