我想从图像中检测面部并将其居中。我能怎么做 ? 我有一张这样的照片:
我希望只显示脸部,就像在这张照片中一样:
答案 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类进行缩放和居中。