我正在研究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上正常运行。
答案 0 :(得分:3)
我再次查看了这段代码,答案结果非常明显:我不断重新初始化CIDetector,这对性能有害,并且还会导致每帧重置内部跟踪数据。因此,第一次检测到面部时,始终是第一次检测到该特定CIDetector实例的面部。
此外,CIDetector在文档中警告:
“此类可以维护许多可能影响性能的状态变量。因此,为了获得最佳性能,请重用CIDetector实例,而不是创建新实例。”,来自https://developer.apple.com/library/mac/documentation/CoreImage/Reference/CIDetector_Ref/Reference/Reference.html。