我在使用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
这有两个问题:
如何更正这些问题?
答案 0 :(得分:2)
CoreImage的人脸检测器在图像坐标空间中工作,而不是在视图空间中工作。 因此,返回给您的坐标以图像中的像素为单位,即视图。
Here是关于这些坐标空间是什么以及如何相互转换的教程。这应该为你清理一切。
就方向而言:你做对了,可能被逆转。
当用户拍照时,无论是横向还是纵向,写在磁盘上的实际图像始终是相同的尺寸。它只在文件中的某个位置设置一个标志,告诉它应该显示在哪个方向(确切地说Exif.Image.Orientation
),标记UIImageView
尊重,但转换为{{时会丢失1}}然后CGImage
。
您可以通过查看原始CIImage
的{{1}}属性来了解是否翻转x
和y
值。如果你想更多地了解这面旗帜究竟是什么,以及令人惊讶的大量人们如何弄错,请转到here