iOS纵向人脸检测

时间:2013-12-11 20:52:50

标签: ios objective-c core-image

我在使用CoreImage的人脸检测方面遇到了麻烦。我的应用程序使用前置摄像头拍摄人脸的肖像照片。这是我的设置:

CIImage* image = [CIImage imageWithCGImage:self.photo.CGImage];
CIContext *context = [CIContext contextWithOptions:nil];
CIDetector* detector = [CIDetector detectorOfType:CIDetectorTypeFace
                                          context:context options:@{CIDetectorAccuracyHigh:CIDetectorAccuracy}];
NSDictionary* imageOptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:6] forKey:CIDetectorImageOrientation];
NSArray* features = [detector featuresInImage:image options:imageOptions];


for (CIFaceFeature *f in features)
{
    NSLog(@"%@",NSStringFromCGRect(f.bounds));

    if (f.hasLeftEyePosition)
        NSLog(@"Left eye %.0f %.0f", f.leftEyePosition.x, f.leftEyePosition.y);

    if (f.hasRightEyePosition)
        NSLog(@"Right eye %.0f %.0f", f.rightEyePosition.x, f.rightEyePosition.y);

    if (f.hasMouthPosition)
        NSLog(@"Mouth %.0f %.0f", f.mouthPosition.x, f.mouthPosition.y);
}

这是我的控制台输出:

{{437.5, 170}, {625, 625}}
Left eye 628 371
Right eye 639 594
Mouth 906 482

这有两个问题:

  1. 这些坐标显然不使用我的应用程序视图(320 X 568)
  2. 他们似乎是错误的方向。眼睛应该具有大约相同的y水平,但是它们具有相同的x水平
  3. 如何更正这些问题?

1 个答案:

答案 0 :(得分:2)

CoreImage的人脸检测器在图像坐标空间中工作,而不是在视图空间中工作。 因此,返回给您的坐标以图像中的像素为单位,即视图。

Here是关于这些坐标空间是什么以及如何相互转换的教程。这应该为你清理一切。

就方向而言:你做对了,可能被逆转。

当用户拍照时,无论是横向还是纵向,写在磁盘上的实际图像始终是相同的尺寸。它只在文件中的某个位置设置一个标志,告诉它应该显示在哪个方向(确切地说Exif.Image.Orientation),标记UIImageView尊重,但转换为{{时会丢失1}}然后CGImage

您可以通过查看原始CIImage的{​​{1}}属性来了解是否翻转xy值。如果你想更多地了解这面旗帜究竟是什么,以及令人惊讶的大量人们如何弄错,请转到here