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 似乎从未存在。有没有人在小牛队得到这个工作?它在山狮上以同样的方式失败。

我在这里看到了一个类似的问题(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 回答