そうです、このキーはあまり文書化されていません。APIドキュメントのほかに、次の場所でも説明されていません。
- CIDetector.hヘッダーファイル
- CoreImageプログラミングガイド
- WWDC2012セッション「520-カメラキャプチャの新機能」
- このセッションのサンプルコード(StacheCam 2)
に対して異なる値を試しましたが、CIDetectorTracking
受け入れられる値はとのみのようです。他の値を使用すると、コンソールに次のメッセージが出力されます。@(YES)
@(NO)
不明なCIDetectorTrackingが指定されました。無視します。
値をに設定する@(YES)
と、検出された顔の特徴を含む追跡IDを取得する必要があります。
ただし、カメラからキャプチャされたコンテンツで顔を検出する場合は、AVFoundationの顔検出APIを使用する必要があります。顔追跡機能が組み込まれており、顔検出はGPUのバックグラウンドで行われ、CoreImageの顔検出よりもはるかに高速になります。iOS6と少なくともiPhone4SまたはiPad2が必要です。
顔はメタデータオブジェクト(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];
詳細については、WWDC2012のサンプルコードを確認してください。