如何将中心图像放在脸上?

时间:2015-05-08 11:24:58

标签: ios objective-c image uiimageview

我想从图像中检测面部并将其居中。我能怎么做 ? 我有一张这样的照片:enter image description here

我希望只显示脸部,就像在这张照片中一样:

enter image description here

1 个答案:

答案 0 :(得分:0)

这远远超出了单个问题的范围,但是除非您自己编写自己的面部检测算法,否则我建议Apple的本地课程{{3} }

示例代码:

CIContext *context = [CIContext contextWithOptions:nil];                    // 1

NSDictionary *opts = @{ CIDetectorAccuracy : CIDetectorAccuracyHigh };      // 2

CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeFace

                                          context:context

                                          options:opts];                    // 3



opts = @{ CIDetectorImageOrientation :

          [[myImage properties] valueForKey:kCGImagePropertyOrientation] }; // 4

NSArray *features = [detector featuresInImage:myImage options:opts];        // 5

1创建一个上下文;在此示例中,iOS的上下文。您可以使用处理图像中描述的任何上下文创建功能。)您还可以选择在创建检测器时提供nil而不是上下文。)

2创建选项字典以指定检测器的准确度。您可以指定低精度或高精度。精度低(CIDetectorAccuracyLow)快;如本例所示,高精度是彻底但较慢的。

3为面部创建检测器。您可以创建的唯一类型的探测器是人脸。

4设置用于查找面部的选项字典。让Core Image了解图像方向非常重要,这样探测器就能知道它可以在哪里找到直立面。大多数情况下,您将从图像本身读取图像方向,然后将该值提供给选项字典。

5使用检测器查找图像中的特征。您提供的图像必须是CIImage对象。 Core Image返回一个CIFeature对象数组,每个对象代表图像中的一个面。

面部特征包括:

left and right eye positions

mouth position

tracking ID and tracking frame count which Core Image uses to follow a face in a video segment

从CIDetector对象获取面部特征数组后,可以遍历数组以检查每个面的边界以及面中的每个特征

for (CIFaceFeature *f in features)

{

    NSLog(NSStringFromRect(f.bounds));



    if (f.hasLeftEyePosition)

        NSLog("Left eye %g %g", f.leftEyePosition.x. f.leftEyePosition.y);



    if (f.hasRightEyePosition)

        NSLog("Right eye %g %g", f.rightEyePosition.x. f.rightEyePosition.y);



    if (f.hasmouthPosition)

        NSLog("Mouth %g %g", f.mouthPosition.x. f.mouthPosition.y);

}

当您检测到脸部时,您可以使用标准的UIKit / CoreImage类进行缩放和居中。