Основной образ в Xamarin.iOS
Основной образ — это новая платформа, представленная в iOS 5, для обеспечения обработки изображений и улучшения видеотрансляций. В этой статье представлены эти функции с примерами Xamarin.iOS.
Core Image — это новая платформа, представленная в iOS 5, которая предоставляет ряд встроенных фильтров и эффектов для применения к изображениям и видео, включая обнаружение лиц.
В этом документе содержатся простые примеры:
- Обнаружение лиц.
- Применение фильтров к изображению
- Перечисление доступных фильтров.
Эти примеры помогут вам приступить к включению функций Core Image в приложения Xamarin.iOS.
Требования
Необходимо использовать последнюю версию Xcode.
Обнаружение лиц
Функция обнаружения лиц Core Image делает только то, что он говорит: он пытается определить лица на фото и возвращает координаты любых лиц, которые он распознает. Эти сведения можно использовать для подсчета количества людей в изображении, рисования индикаторов на изображении (например, для "тегов" людей в фотографии), или что-либо другое, о чем вы можете подумать.
Этот код из CoreImage\SampleCode.cs демонстрирует создание и использование обнаружения лиц на внедренном изображении:
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);
Массив функций будет заполнен CIFaceFeature
объектами (если обнаружены лица). CIFaceFeature
Существует для каждого лица. CIFaceFeature
имеет следующие свойства:
- HasMouthPosition — обнаружен ли рот для этого лица.
- HasLeftEyePosition — обнаружен ли левый глаз для этого лица.
- HasRightEyePosition — был ли обнаружен правильный глаз для этого лица.
- РотПозиция — координаты рта для этого лица.
- LeftEyePosition — координаты левого глаза для этого лица.
- RightEyePosition — координаты правого глаза для этого лица.
Координаты для всех этих свойств имеют свое происхождение в левом нижнем углу , в отличие от UIKit, который использует верхний левый в качестве источника. При использовании координат CIFaceFeature
обязательно перевернуть их. Это очень простое пользовательское представление изображения в CoreImage\CoreImageViewController.cs демонстрирует, как нарисовать треугольники индикатора лица на изображении (обратите внимание на 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);
}
}
Затем в файле SampleCode.cs изображение и компоненты назначаются перед перезаписи образа:
faceView.Image = image;
faceView.Features = features;
faceView.SetNeedsDisplay();
На снимке экрана показан пример выходных данных: расположения обнаруженных признаков лица отображаются в UITextView и рисуются на исходном изображении с помощью CoreGraphics.
Из-за того, как распознавание лиц работает, он иногда обнаруживает вещи помимо человеческих лиц (как эти томи обезьяны!).
Фильтры
Существует более 50 различных встроенных фильтров, и платформа расширяема, чтобы новые фильтры могли быть реализованы.
Применение фильтров
Применение фильтра к изображению состоит из четырех различных шагов: загрузка изображения, создание фильтра, применение фильтра и сохранение (или отображение) результата.
Сначала загрузите изображение в CIImage
объект.
var uiimage = UIImage.FromFile ("photo.JPG");
var ciimage = new CIImage (uiimage);
Во-вторых, создайте класс фильтра и задайте его свойства.
var sepia = new CISepiaTone();
sepia.Image = ciimage;
sepia.Intensity = 0.8f;
В-третьих, получите доступ к свойству OutputImage
и вызовите CreateCGImage
метод для отрисовки окончательного результата.
CIImage output = sepia.OutputImage;
var context = CIContext.FromOptions(null);
var cgimage = context.CreateCGImage (output, output.Extent);
Наконец, назначьте изображение представлению, чтобы увидеть результат. В реальном приложении полученный образ может быть сохранен в файловой системе, фотоальбоме, твите или электронной почте.
var ui = UIImage.FromImage (cgimage);
imgview.Image = ui;
На этих снимках экрана показаны результаты CISepia
и CIHueAdjust
фильтры, которые демонстрируются в примере кода CoreImage.zip.
Пример фильтра см. в разделе "Изменить контракт и яркость" рецепта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;
Перечисление фильтров и их свойств
Этот код из CoreImage\SampleCode.cs выводит полный список встроенных фильтров и их параметров.
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 описывает встроенные фильтры и их свойства. Используя приведенный выше код, можно запросить классы фильтров, включая значения по умолчанию для параметров и максимальные и минимальные допустимые значения (которые можно использовать для проверки входных данных перед применением фильтра).
Выходные данные "Категории списка" выглядят следующим образом на симуляторе: можно прокрутить список, чтобы просмотреть все фильтры и их параметры.
Каждый указанный фильтр предоставляется в виде класса в Xamarin.iOS, поэтому вы также можете изучить API Xamarin.iOS.CoreImage в браузере сборок или с помощью автоматического завершения в Visual Studio для Mac или Visual Studio.
Итоги
В этой статье показано, как использовать некоторые из новых функций платформы образов iOS 5 Core, таких как обнаружение лиц и применение фильтров к изображению. В платформе доступны десятки различных фильтров изображений.