我正在尝试制作一个基本应用程序来显示来自 iSight 的视频输入并使用 CIDetector 进行人脸检测。
我怎样才能做到这一点?要使用 CIDetector,我需要 CIImage。我可以以某种方式将每一帧作为 CIImage 并在其上运行检测器吗?然后显示原始输入,加上一些我想添加的效果。
谢谢
我正在尝试制作一个基本应用程序来显示来自 iSight 的视频输入并使用 CIDetector 进行人脸检测。
我怎样才能做到这一点?要使用 CIDetector,我需要 CIImage。我可以以某种方式将每一帧作为 CIImage 并在其上运行检测器吗?然后显示原始输入,加上一些我想添加的效果。
谢谢
本质上,您使用 AVFoundation 的组合来捕获帧和 Core Image 使用检测来处理这些帧。
作为起点,您可以从以下教程开始:http: //indieambitions.com/idevblogaday/raw-video-data-app-quick-dirty/
这是设置 EAGLContext、AVCaptureSession 和所有输入和输出的绝佳开始。它还展示了如何将您的 CMSampleBufferRef 转换为您可以处理的核心图像。
要启动并运行人脸检测,您需要添加一个 CIDetector(在这种情况下@property (nonatomic, strong) CIDetector *faceDetector
),使用以下内容修改 viewDidLoad 代码:
[CIDetector detectorOfType:CIDetectorTypeFace context:nil options:@{ CIDetectorAccuracy : CIDetectorAccuracyLow }];
请注意,您可以根据性能更改准确性。
之后,当您捕获数据时,您可以通过在captureOutput:DidOutputSampleBuffer:fromConnection:
函数中输入以下内容来收集所有面孔:
NSArray *featureArray = [self.faceDetector featuresInImage:image];
for (CIFeature *faceFeature in featureArray) {
if ([faceFeature.type isEqualToString:CIFeatureTypeFace]) { //future proof!
CGRect faceRect = faceFeature.bounds;
//do whatever you want with faceRect here.
}
}
注意:这是一种让它启动并运行的方法,但我只能让它在视网膜 iPad 上以微不足道的 15 fps 运行。在 WWDC 视频和后续源代码中,他们非常有效地使用 CIDetector,因此可以完成。
祝你好运!