iSight からのビデオ入力を表示し、CIDetector で顔検出を行う基本的なアプリを作成しようとしています。
どうやってやるの?CIDetector を使用するには、CIImage が必要です。どうにかして各フレームを CIImage として取得し、その上で検出器を実行できますか? 次に、元の入力と、追加したいいくつかの効果を表示します。
ありがとう
iSight からのビデオ入力を表示し、CIDetector で顔検出を行う基本的なアプリを作成しようとしています。
どうやってやるの?CIDetector を使用するには、CIImage が必要です。どうにかして各フレームを CIImage として取得し、その上で検出器を実行できますか? 次に、元の入力と、追加したいいくつかの効果を表示します。
ありがとう
基本的に、AVFoundationを組み合わせてフレームをキャプチャし、CoreImageを使用して検出を使用してそれらのフレームを処理します。
出発点として、次のチュートリアルに従うことから始めることができます: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.
}
}
注:これは起動して実行する方法ですが、RetinaiPadではわずか15fpsでしか実行できませんでした。WWDCビデオとそれに続くソースコードでは、CIDetectorを非常に効率的に使用しているため、それを実行できます。
幸運を!