Xamarin.iOS의 핵심 이미지
핵심 이미지는 이미지 처리 및 라이브 비디오 향상 기능을 제공하기 위해 iOS 5와 함께 도입된 새로운 프레임워크입니다. 이 문서에서는 Xamarin.iOS 샘플을 사용하여 이러한 기능을 소개합니다.
핵심 이미지는 얼굴 감지를 포함하여 이미지 및 비디오에 적용할 수 있는 다양한 기본 제공 필터와 효과를 제공하는 iOS 5에 도입된 새로운 프레임워크입니다.
이 문서에는 다음과 같은 간단한 예제가 포함되어 있습니다.
- 얼굴 감지.
- 이미지에 필터 적용
- 사용 가능한 필터를 나열합니다.
이러한 예제는 Xamarin.iOS 애플리케이션에 핵심 이미지 기능을 통합하는 데 도움이 됩니다.
요구 사항
최신 버전의 Xcode를 사용해야 합니다.
얼굴 감지
핵심 이미지 얼굴 감지 기능은 사진에서 얼굴을 식별하려고 시도하고 인식되는 모든 얼굴의 좌표를 반환합니다. 이 정보를 사용하여 이미지의 사용자 수를 계산하거나, 이미지에 표시기를 그립니다(예: 사진의 '태그 지정' 사람) 또는 생각할 수 있는 다른 모든 항목에 사용할 수 있습니다.
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
채워집니다(얼굴이 감지된 경우). 각 얼굴에 대한 A CIFaceFeature
가 있습니다. CIFaceFeature
에는 다음 속성이 있습니다.
- HasMouthPosition – 이 얼굴에 대해 입이 감지되었는지 여부입니다.
- HasLeftEyePosition – 왼쪽 눈이 이 얼굴에 대해 감지되었는지 여부입니다.
- HasRightEyePosition – 이 얼굴에 대한 오른쪽 눈이 감지되었는지 여부입니다.
- MouthPosition – 이 얼굴의 입 좌표입니다.
- 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;
이러한 스크린샷은 CoreImage.zip 샘플 코드에 설명된 필터 및 CIHueAdjust
결과를 CISepia
보여 줍니다.
필터의 예는 이미지 레시피 의 계약 및 밝기 조정을 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 클래스 참조는 50개의 기본 제공 필터 및 해당 속성을 설명합니다. 위의 코드를 사용하여 매개 변수에 대한 기본값과 허용되는 최대값 및 최소값(필터를 적용하기 전에 입력의 유효성을 검사하는 데 사용할 수 있음)을 포함하여 필터 클래스를 쿼리할 수 있습니다.
목록 범주 출력은 시뮬레이터에서 다음과 같이 표시됩니다. 목록을 스크롤하여 모든 필터와 해당 매개 변수를 볼 수 있습니다.
나열된 각 필터는 Xamarin.iOS에서 클래스로 노출되었으므로 어셈블리 브라우저에서 Xamarin.iOS.CoreImage API를 탐색하거나 Mac용 Visual Studio 또는 Visual Studio에서 자동 완성을 사용할 수도 있습니다.
요약
이 문서에서는 얼굴 감지 및 이미지에 필터 적용과 같은 새로운 iOS 5 Core Image 프레임워크 기능 중 일부를 사용하는 방법을 보여 줍니다. 프레임워크에서 사용할 수 있는 수십 가지 이미지 필터가 있습니다.