问题来自 UIImage 和 CIDetectorImageOrientation 中的方向之间的差异。来自 iOS 文档:
CIDetectorImageOrientation
用于指定要检测其特征的图像的显示方向的键。该键是一个 NSNumber 对象,其值与 TIFF 和 EXIF 规范定义的值相同;值的范围可以从 1 到 8。该值指定图像的原点 (0,0) 所在的位置。如果不存在,则默认值为 1,这意味着图像的原点是左上角。有关每个值指定的图像原点的详细信息,请参阅 kCGImagePropertyOrientation。
在 iOS 5.0 及更高版本中可用。
在 CIDetector.h 中声明。
您必须指定 CIDetectorImageOrientation。这是我所做的:
int exifOrientation;
switch (self.image.imageOrientation) {
case UIImageOrientationUp:
exifOrientation = 1;
break;
case UIImageOrientationDown:
exifOrientation = 3;
break;
case UIImageOrientationLeft:
exifOrientation = 8;
break;
case UIImageOrientationRight:
exifOrientation = 6;
break;
case UIImageOrientationUpMirrored:
exifOrientation = 2;
break;
case UIImageOrientationDownMirrored:
exifOrientation = 4;
break;
case UIImageOrientationLeftMirrored:
exifOrientation = 5;
break;
case UIImageOrientationRightMirrored:
exifOrientation = 7;
break;
default:
break;
}
NSDictionary *detectorOptions = @{ CIDetectorAccuracy : CIDetectorAccuracyHigh };
CIDetector *faceDetector = [CIDetector detectorOfType:CIDetectorTypeFace context:nil options:detectorOptions];
NSArray *features = [faceDetector featuresInImage:[CIImage imageWithCGImage:self.image.CGImage]
options:@{CIDetectorImageOrientation:[NSNumber numberWithInt:exifOrientation]}];
检测到特征后,还需要将坐标映射到uiimage视图中,这里使用我的gist:https ://gist.github.com/laoyang/5747004转换坐标系