Aracılığıyla paylaş


Xamarin.iOS'ta Çekirdek Görüntü

Core Image, görüntü işleme ve canlı video geliştirme işlevselliği sağlamak için iOS 5 ile sunulan yeni bir çerçevedir. Bu makalede Xamarin.iOS örnekleriyle bu özellikler tanıtabilirsiniz.

Core Image, iOS 5'te kullanıma sunulan ve yüz algılama da dahil olmak üzere görüntü ve videolara uygulanacak bir dizi yerleşik filtre ve efekt sağlayan yeni bir çerçevedir.

Bu belgede şunlara örnek verilmiştir:

  • Yüz algılama.
  • Görüntüye filtre uygulama
  • Kullanılabilir filtreleri listeleme.

Bu örnekler, Xamarin.iOS uygulamalarınıza Çekirdek Görüntü özelliklerini eklemeye başlamanıza yardımcı olmalıdır.

Gereksinimler

Xcode'un en son sürümünü kullanmanız gerekir.

Yüz Algılama

Çekirdek Görüntü yüz algılama özelliği tam olarak söylediği şeyi yapar; bir fotoğraftaki yüzleri tanımlamaya çalışır ve tanıdığı tüm yüzlerin koordinatlarını döndürür. Bu bilgiler bir görüntüdeki kişi sayısını saymak, görüntüye göstergeler çizmek (örneğin, bir fotoğraftaki kişileri 'etiketlemek' için) veya aklınıza gelen başka bir şey için kullanılabilir.

CoreImage\SampleCode.cs'dan alınan bu kod, katıştırılmış bir görüntüde yüz algılamanın nasıl oluşturulacağını ve kullanılacağını gösterir:

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

Özellikler dizisi nesnelerle CIFaceFeature doldurulur (herhangi bir yüz algılandıysa). Her yüz için bir CIFaceFeature vardır. CIFaceFeature aşağıdaki özelliklere sahiptir:

  • HasMouthPosition – Bu yüz için bir ağız algılanıp algılanmadı.
  • HasLeftEyePosition – Bu yüz için sol gözün algılanıp algılanamadığı.
  • HasRightEyePosition – Bu yüz için sağ gözün algılanıp algılanmadı.
  • MouthPosition – Bu yüz için ağzın koordinatları.
  • LeftEyePosition : Bu yüz için sol gözün koordinatları.
  • RightEyePosition : Bu yüz için sağ gözün koordinatları.

Tüm bu özelliklerin koordinatları, çıkış noktası olarak sol üst kısmı kullanan UIKit'in aksine, çıkış noktası sol alttadır. Koordinatları kullanırken CIFaceFeature bunları 'çevirdiğinizden' emin olun. CoreImage\CoreImageViewController.cs'daki bu çok temel özel görüntü görünümü, görüntüde 'yüz göstergesi' üçgenlerinin nasıl çizilmeye baş yapılacağını gösterir (yöntemini not edin FlipForBottomOrigin ):

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

Ardından SampleCode.cs dosyasında görüntü ve özellikler, görüntü yeniden çizilmeden önce atanır:

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

Ekran görüntüsü örnek çıkışı gösterir: Algılanan yüz özelliklerinin konumları bir UITextView'da görüntülenir ve CoreGraphics kullanılarak kaynak görüntüye çizilir.

Yüz tanımanın çalışma şekli nedeniyle zaman zaman insan yüzleri dışında (bu oyuncak maymunlar gibi!) şeyleri algılar.

Filtreler

50'den fazla farklı yerleşik filtre vardır ve çerçeve, yeni filtrelerin uygulanabilmesi için genişletilebilir.

Filtreleri Kullanma

Görüntüye filtre uygulama dört ayrı adımdan oluşur: görüntüyü yükleme, filtreyi oluşturma, filtreyi uygulama ve sonucu kaydetme (veya görüntüleme).

İlk olarak, bir nesneye CIImage görüntü yükleyin.

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

İkincisi, filtre sınıfını oluşturun ve özelliklerini ayarlayın.

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

Üçüncüsü, özelliğine erişin OutputImage ve son sonucu işlemek için yöntemini çağırın CreateCGImage .

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

Son olarak, sonucu görmek için görüntüyü bir görünüme atayın. Gerçek dünyadaki bir uygulamada sonuçta elde edilen görüntü dosya sistemine, Fotoğraf Albümü'ne, Tweet'e veya e-postaya kaydedilebilir.

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

Bu ekran görüntüleri, CoreImage.zip örnek kodunda gösterildiği gibi ve CIHueAdjust filtrelerinin sonucunu CISepia gösterir.

Filtre örneği için Bkz. Resim Tarifinin Sözleşmesini CIColorControls ve Parlaklığını Ayarlama.

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;

Filtreleri ve Özelliklerini Listeleme

CoreImage\SampleCode.cs'den alınan bu kod, yerleşik filtrelerin ve parametrelerinin tam listesini oluşturur.

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

CIFilter Sınıf Başvurusu, 50 yerleşik filtreyi ve bunların özelliklerini açıklar. Yukarıdaki kodu kullanarak, parametreler için varsayılan değerler ve izin verilen en büyük ve en düşük değerler de dahil olmak üzere filtre sınıflarını sorgulayabilirsiniz (filtre uygulamadan önce girişleri doğrulamak için kullanılabilir).

Liste Kategorileri çıkışı simülatörde şöyle görünür; tüm filtreleri ve parametrelerini görmek için listeyi kaydırabilirsiniz.

Liste Kategorileri çıkışı simülatörde şöyle görünür

Listelenen her filtre Xamarin.iOS'ta sınıf olarak kullanıma sunuldu, bu nedenle Xamarin.iOS.CoreImage API'sini Assembly Browser'da veya Mac için Visual Studio veya Visual Studio'da otomatik tamamlama kullanarak da keşfedebilirsiniz.

Özet

Bu makalede yüz algılama ve görüntüye filtre uygulama gibi yeni iOS 5 Core Image framework özelliklerinden bazılarının nasıl kullanılacağı gösterilmiştir. Çerçevede kullanabileceğiniz onlarca farklı görüntü filtresi vardır.