你是对的,这个密钥没有很好的记录。除了 API 文档之外,它也没有在以下内容中解释:
- CIDetector.h 头文件
- 核心图像编程指南
- WWDC 2012 会议“520 - 相机捕捉的新功能”
- 本次会议的示例代码 ( StacheCam 2 )
我尝试了不同的值,CIDetectorTracking
唯一接受的值似乎是@(YES)
and @(NO)
。使用其他值,它会在控制台中打印此消息:
指定了未知的 CIDetectorTracking。无视。
当您将值设置为时,@(YES)
您应该使用检测到的面部特征获取跟踪 ID。
但是,当您想要检测从相机捕获的内容中的人脸时,您应该更喜欢 AVFoundation 中的人脸检测 API。它内置人脸跟踪,人脸检测在 GPU 的后台进行,比 CoreImage 人脸检测要快得多。它需要 iOS 6 和至少 iPhone 4S 或 iPad 2。
人脸作为元数据对象 ( AVMetadataFaceObject
) 发送到AVCaptureMetadataOutputObjectsDelegate
.
您可以使用此代码(取自StacheCam 2和上面提到的 WWDC 会话的幻灯片)来设置人脸检测并获取人脸元数据对象:
- (void) setupAVFoundationFaceDetection
{
self.metadataOutput = [AVCaptureMetadataOutput new];
if ( ! [self.session canAddOutput:self.metadataOutput] ) {
return;
}
// Metadata processing will be fast, and mostly updating UI which should be done on the main thread
// So just use the main dispatch queue instead of creating a separate one
// (compare this to the expensive CoreImage face detection, done on a separate queue)
[self.metadataOutput setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
[self.session addOutput:self.metadataOutput];
if ( ! [self.metadataOutput.availableMetadataObjectTypes containsObject:AVMetadataObjectTypeFace] ) {
// face detection isn't supported (via AV Foundation), fall back to CoreImage
return;
}
// We only want faces, if we don't set this we would detect everything available
// (some objects may be expensive to detect, so best form is to select only what you need)
self.metadataOutput.metadataObjectTypes = @[ AVMetadataObjectTypeFace ];
}
// AVCaptureMetadataOutputObjectsDelegate
- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputMetadataObjects:(NSArray *)metadataObjects
fromConnection:(AVCaptureConnection *)c
{
for ( AVMetadataObject *object in metadataObjects ) {
if ( [[object type] isEqual:AVMetadataObjectTypeFace] ) {
AVMetadataFaceObject* face = (AVMetadataFaceObject*)object;
CMTime timestamp = [face time];
CGRect faceRectangle = [face bounds];
NSInteger faceID = [face faceID];
CGFloat rollAngle = [face rollAngle];
CGFloat yawAngle = [face yawAngle];
NSNumber* faceID = @(face.faceID); // use this id for tracking
// Do interesting things with this face
}
}
如果要在预览层中显示人脸框,则需要获取转换后的人脸对象:
AVMetadataFaceObject * adjusted = (AVMetadataFaceObject*)[self.previewLayer transformedMetadataObjectForMetadataObject:face];
有关详细信息,请查看WWDC 2012 中的示例代码。