1

我正在尝试将人脸检测添加到我的应用程序中,我添加的代码给了我一个与人脸无关的 CGRect。

这是代码

CIImage  *cIImage = [CIImage imageWithCGImage:self.imageView.image.CGImage];
CIDetector* faceDetector = [CIDetector detectorOfType:CIDetectorTypeFace
                                          context:nil options:[NSDictionary  
       dictionaryWithObject:CIDetectorAccuracyHigh forKey:CIDetectorAccuracy]];
NSArray *features = [faceDetector featuresInImage:cIImage];
for(CIFaceFeature* faceObject in features)
{
    FaceLocation.x = faceObject.bounds.origin.x;
    FaceLocation.y = faceObject.bounds.origin.y;
}// Here face location is far off away form the actual face

但是这段代码给了我一个远离真实面孔的位置,我在这里做错了什么?

4

2 回答 2

2

问题来自 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转换坐标系

于 2013-07-18T06:54:45.887 回答
0

iOS 10 和 Swift 3

如果您对面部特征不感兴趣

您可以查看苹果示例,您可以检测到它与Orientation配合得很好

您可以选择人脸元数据使相机跟踪人脸并在脸上显示黄色框

它的性能比这个例子好

于 2016-12-20T12:06:10.330 回答