CIDetector trackingID永远不会出现

时间:2013-11-14 16:59:36

标签: macos cocoa face-detection osx-mavericks core-image

我正在研究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 is always coming same for multiple faces),但我没有在那里学到任何新东西。

对于它的价值似乎在iOS上正常运行。

1 个答案:

答案 0 :(得分:3)

我再次查看了这段代码,答案结果非常明显:我不断重新初始化CIDetector,这对性能有害,并且还会导致每帧重置内部跟踪数据。因此,第一次检测到面部时,始终是第一次检测到该特定CIDetector实例的面部。

此外,CIDetector在文档中警告:

“此类可以维护许多可能影响性能的状态变量。因此,为了获得最佳性能,请重用CIDetector实例,而不是创建新实例。”,来自https://developer.apple.com/library/mac/documentation/CoreImage/Reference/CIDetector_Ref/Reference/Reference.html