Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Core Image è un nuovo framework introdotto con iOS 5 per fornire funzionalità di elaborazione delle immagini e miglioramento del video live. Questo articolo presenta queste funzionalità con esempi di Xamarin.iOS.
Core Image è un nuovo framework introdotto in iOS 5 che fornisce diversi filtri ed effetti predefiniti da applicare a immagini e video, incluso il rilevamento dei volti.
Questo documento contiene semplici esempi di:
- Rilevamento viso.
- Applicazione di filtri a un'immagine
- Elenco dei filtri disponibili.
Questi esempi consentono di iniziare a incorporare le funzionalità core image nelle applicazioni Xamarin.iOS.
Requisiti
È necessario usare la versione più recente di Xcode.
Rilevamento viso
La funzionalità di rilevamento viso immagine principale esegue solo ciò che dice: tenta di identificare i visi in una foto e restituisce le coordinate di qualsiasi visi che riconosce. Queste informazioni possono essere usate per contare il numero di persone in un'immagine, disegnare indicatori sull'immagine (ad esempio, per "contrassegnare" le persone in una fotografia) o qualsiasi altra cosa si possa pensare.
Questo codice di CoreImage\SampleCode.cs illustra come creare e usare il rilevamento dei volti in un'immagine incorporata:
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);
La matrice di funzionalità verrà popolata con CIFaceFeature oggetti (se sono stati rilevati visi). C'è un CIFaceFeature per ogni viso. CIFaceFeature ha le proprietà seguenti:
- HasMouthPosition : indica se è stata rilevata una bocca per questo viso.
- HasLeftEyePosition: indica se l'occhio sinistro è stato rilevato per questo viso.
- HasRightEyePosition: indica se l'occhio destro è stato rilevato per questo viso.
- MouthPosition: coordinate della bocca per questo viso.
- LeftEyePosition: coordinate dell'occhio sinistro per questo viso.
- RightEyePosition: coordinate dell'occhio destro per questo viso.
Le coordinate per tutte queste proprietà hanno la loro origine in basso a sinistra, a differenza di UIKit che usa l'origine in alto a sinistra. Quando si usano le coordinate, CIFaceFeature assicurarsi di 'capovolgerle'. Questa visualizzazione immagine personalizzata di base in CoreImage\CoreImageViewController.cs illustra come disegnare triangoli "indicatore viso" sull'immagine (si noti il FlipForBottomOrigin metodo ):
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);
}
}
Quindi, nel file SampleCode.cs l'immagine e le funzionalità vengono assegnate prima che l'immagine venga ridisegnata:
faceView.Image = image;
faceView.Features = features;
faceView.SetNeedsDisplay();
Lo screenshot mostra l'output di esempio: le posizioni delle caratteristiche facciali rilevate vengono visualizzate in un oggetto UITextView e disegnate nell'immagine di origine usando CoreGraphics.
A causa del modo in cui funziona il riconoscimento facciale, a volte rileverà cose oltre ai visi umani (come queste scimmie toy!).
Filtri
Sono disponibili oltre 50 filtri predefiniti diversi e il framework è estendibile in modo che sia possibile implementare nuovi filtri.
Utilizzo dei filtri
L'applicazione di un filtro a un'immagine prevede quattro passaggi distinti: caricamento dell'immagine, creazione del filtro, applicazione del filtro e salvataggio (o visualizzazione) del risultato.
Prima di tutto, caricare un'immagine in un CIImage oggetto .
var uiimage = UIImage.FromFile ("photo.JPG");
var ciimage = new CIImage (uiimage);
In secondo luogo, creare la classe di filtro e impostarne le proprietà.
var sepia = new CISepiaTone();
sepia.Image = ciimage;
sepia.Intensity = 0.8f;
In terzo luogo, accedere alla OutputImage proprietà e chiamare il CreateCGImage metodo per eseguire il rendering del risultato finale.
CIImage output = sepia.OutputImage;
var context = CIContext.FromOptions(null);
var cgimage = context.CreateCGImage (output, output.Extent);
Assegnare infine l'immagine a una visualizzazione per visualizzare il risultato. In un'applicazione reale l'immagine risultante potrebbe essere salvata nel file system, nell'album fotografico, in un tweet o in un messaggio di posta elettronica.
var ui = UIImage.FromImage (cgimage);
imgview.Image = ui;
Questi screenshot mostrano il risultato dei CISepia filtri e CIHueAdjust illustrati nel codice di esempio CoreImage.zip.
Per un esempio del filtro, vedere Regola contratto e luminosità di una ricetta immagine CIColorControls .
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;
Elencare i filtri e le relative proprietà
Questo codice di CoreImage\SampleCode.cs restituisce l'elenco completo dei filtri predefiniti e dei relativi parametri.
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";
}
}
Le informazioni di riferimento sulla classe CIFilter descrivono i 50 filtri predefiniti e le relative proprietà. Usando il codice precedente è possibile eseguire query sulle classi di filtro, inclusi i valori predefiniti per i parametri e i valori massimi e minimi consentiti (che possono essere usati per convalidare gli input prima di applicare un filtro).
L'output List Categories è simile al seguente nel simulatore. È possibile scorrere l'elenco per visualizzare tutti i filtri e i relativi parametri.
Ogni filtro elencato è stato esposto come classe in Xamarin.iOS, quindi è anche possibile esplorare l'API Xamarin.iOS.CoreImage nel Browser assembly o usare il completamento automatico in Visual Studio per Mac o Visual Studio.
Riepilogo
Questo articolo ha illustrato come usare alcune delle nuove funzionalità del framework di immagini core di iOS 5, ad esempio il rilevamento dei volti e l'applicazione di filtri a un'immagine. Nel framework sono disponibili decine di filtri di immagine diversi.
