3

私は OSX Mavericks でいくつかの顔検出コードに取り組んでおり、CIDetector が提供する複数の静止画機能で新しい (10.8 の時点で) 顔追跡を利用しようとしています。

次のように、基本的な顔検出が正常に機能しています。

- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
       fromConnection:(AVCaptureConnection *)connection {

    CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
    CIImage *image =  [CIImage imageWithCVImageBuffer:imageBuffer];
    CIDetector *faceDetector = [CIDetector detectorOfType:CIDetectorTypeFace
                                                  context:nil
                                                  options:@{ CIDetectorAccuracy : CIDetectorAccuracyHigh,
                                                         CIDetectorTracking : @YES
                                                        }];
    NSArray *features = [faceDetector featuresInImage:image];
    for ( CIFaceFeature *feature in features ) {
        if (feature.hasTrackingID) {
            NSLog(@"tracking id: %@", @(feature.trackingID));
        }
    }
}

機能リストは正しく入力されますが、trackingID は存在しないようです。マーベリックスでこれを機能させた人はいますか? Mountain Lion でも同じように失敗します。

ここで同様の質問を見たことがあります ( CIFaceFeature trackingID は常に複数の顔に対して同じになります) が、そこで新しいことは何も学びませんでした。

価値があるのは、iOSで正しく機能するようです.

4

1 に答える 1

3

このコードをもう一度見てみると、答えは明らかでした。CIDetector を常に再初期化していたため、パフォーマンスが低下し、フレームごとに内部追跡データがリセットされていました。そのため、顔が最初に検出されたのは、常にその特定の CIDetector インスタンスで初めて顔が検出されたときです。

また、CIDetector はドキュメントでこれについて警告します。

「このクラスは、パフォーマンスに影響を与える可能性のある多くの状態変数を維持できます。したがって、最高のパフォーマンスを得るには、新しいものを作成する代わりに CIDetector インスタンスを再利用してください。」、https://developer.apple.com/library/mac/documentation/CoreImage/Reference/ CIDetector_Ref/Reference/Reference.html .

于 2013-11-19T02:24:18.553 に答える