Obraz podstawowy na platformie Xamarin.iOS
Obraz podstawowy to nowa struktura wprowadzona w systemie iOS 5 w celu zapewnienia przetwarzania obrazów i rozszerzenia wideo na żywo. W tym artykule przedstawiono te funkcje z przykładami platformy Xamarin.iOS.
Obraz podstawowy to nowa struktura wprowadzona w systemie iOS 5, która udostępnia szereg wbudowanych filtrów i efektów stosowania do obrazów i wideo, w tym wykrywania twarzy.
Ten dokument zawiera proste przykłady:
- Wykrywanie twarzy.
- Stosowanie filtrów do obrazu
- Wyświetlanie listy dostępnych filtrów.
Te przykłady powinny pomóc w rozpoczęciu dołączania podstawowych funkcji obrazu do aplikacji platformy Xamarin.iOS.
Wymagania
Musisz użyć najnowszej wersji programu Xcode.
Wykrywanie twarzy
Funkcja wykrywania twarzy na obrazie podstawowym wykonuje tylko to, co mówi — próbuje zidentyfikować twarze na zdjęciu i zwraca współrzędne wszystkich rozpoznanych twarzy. Te informacje mogą służyć do zliczania liczby osób na obrazie, rysowania wskaźników na obrazie (np. do oznaczania" osób na zdjęciu) lub innych, o których można myśleć.
Ten kod z coreImage\SampleCode.cs pokazuje, jak utworzyć i używać wykrywania twarzy na osadzonym obrazie:
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);
Tablica funkcji zostanie wypełniona obiektami CIFaceFeature
(jeśli zostaną wykryte jakiekolwiek twarze). Każda twarz ma wartość a CIFaceFeature
. CIFaceFeature
ma następujące właściwości:
- HasMouthPosition — czy usta zostały wykryte dla tej twarzy.
- HasLeftEyePosition — czy lewe oko zostało wykryte dla tej twarzy.
- HasRightEyePosition — czy dla tej twarzy wykryto prawe oko.
- MouthPosition — współrzędne ust dla tej twarzy.
- LeftEyePosition — współrzędne lewego oka dla tej twarzy.
- RightEyePosition — współrzędne prawego oka dla tej twarzy.
Współrzędne wszystkich tych właściwości mają swoje pochodzenie w lewym dolnym rogu — w przeciwieństwie do zestawu UIKit, który używa lewego górnego rogu jako źródła. W przypadku używania współrzędnych należy CIFaceFeature
je przerzucić. Ten bardzo podstawowy niestandardowy widok obrazu w programie CoreImage\CoreImageViewController.cs pokazuje, jak narysować trójkąty "wskaźnika twarzy" na obrazie (zwróć uwagę na FlipForBottomOrigin
metodę):
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);
}
}
Następnie w pliku SampleCode.cs obraz i funkcje są przypisywane przed ponownym rysowanie obrazu:
faceView.Image = image;
faceView.Features = features;
faceView.SetNeedsDisplay();
Zrzut ekranu przedstawia przykładowe dane wyjściowe: lokalizacje wykrytych cech twarzy są wyświetlane w widoku UITextView i rysowane na obrazie źródłowym przy użyciu technologii CoreGraphics.
Ze względu na sposób rozpoznawania twarzy działa to od czasu do czasu wykrywa rzeczy oprócz ludzkich twarzy (takich jak te małpy tory!).
Filtry
Istnieje ponad 50 różnych wbudowanych filtrów, a struktura jest rozszerzalna, aby można było zaimplementować nowe filtry.
Używanie filtrów
Zastosowanie filtru do obrazu ma cztery odrębne kroki: ładowanie obrazu, tworzenie filtru, stosowanie filtru i zapisywanie (lub wyświetlanie) wyniku.
Najpierw załaduj CIImage
obraz do obiektu.
var uiimage = UIImage.FromFile ("photo.JPG");
var ciimage = new CIImage (uiimage);
Następnie utwórz klasę filtru i ustaw jej właściwości.
var sepia = new CISepiaTone();
sepia.Image = ciimage;
sepia.Intensity = 0.8f;
Po trzecie, uzyskaj dostęp do OutputImage
właściwości i wywołaj metodę CreateCGImage
w celu renderowania wyniku końcowego.
CIImage output = sepia.OutputImage;
var context = CIContext.FromOptions(null);
var cgimage = context.CreateCGImage (output, output.Extent);
Na koniec przypisz obraz do widoku, aby wyświetlić wynik. W rzeczywistej aplikacji wynikowy obraz może zostać zapisany w systemie plików, album fotograficzny, tweet lub wiadomość e-mail.
var ui = UIImage.FromImage (cgimage);
imgview.Image = ui;
Te zrzuty ekranu pokazują wynik CISepia
filtrów i CIHueAdjust
przedstawionych w przykładowym kodzie CoreImage.zip.
Zobacz dostosowywanie kontraktu i jasności przepisu obrazu, aby zapoznać się z przykładem filtruCIColorControls
.
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;
Wyświetlanie listy filtrów i ich właściwości
Ten kod z obiektu CoreImage\SampleCode.cs zwraca pełną listę wbudowanych filtrów i ich parametrów.
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";
}
}
Odwołanie do klasy CIFilter opisuje 50 wbudowanych filtrów i ich właściwości. Korzystając z powyższego kodu, można wykonywać zapytania dotyczące klas filtrów, w tym wartości domyślne parametrów oraz maksymalne i minimalne dozwolone wartości (które mogą służyć do weryfikowania danych wejściowych przed zastosowaniem filtru).
Dane wyjściowe Kategorii listy wyglądają następująco w symulatorze — możesz przewijać listę, aby wyświetlić wszystkie filtry i ich parametry.
Każdy z wymienionych filtrów został uwidoczniony jako klasa w środowisku Xamarin.iOS, dzięki czemu możesz również eksplorować interfejs API Xamarin.iOS.CoreImage w przeglądarce zestawów lub za pomocą autouzupełniania w Visual Studio dla komputerów Mac lub Visual Studio.
Podsumowanie
W tym artykule pokazano, jak używać niektórych nowych funkcji platformy obrazów podstawowych systemu iOS 5, takich jak wykrywanie twarzy i stosowanie filtrów do obrazu. Istnieje kilkadziesiąt różnych filtrów obrazów dostępnych w strukturze do użycia.