2013-12-11 51 views
-1

CoreImage的人脸检测出现问题。我的应用程序使用前置摄像头拍摄脸部照片。这里是我的设置:肖像中的iOS人脸检测

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 

有2个问题是:

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

我该如何解决这些问题?

+0

它们可能是像素,可能是肖像。 – Jessedc

回答

2

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

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

就目前情况而言:你说得对,可能会颠倒

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

您可以通过查看原始UIImageimageOrientation属性来知道是否要翻转xy值。如果你想了解更多关于这个标志究竟是什么的,以及如何令人惊讶的大量人发现它错误,请转到here