Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Основной образ — это новая платформа, представленная в 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, таких как обнаружение лиц и применение фильтров к изображению. В платформе доступны десятки различных фильтров изображений.
