2012-02-02 13 views
10

iOS 5でCoreImageの顔検出を使用しようとしていますが、何も検出していません。 ...どれiOSの顔検出の問題

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 
    UIImage *image = [info objectForKey:@"UIImagePickerControllerOriginalImage"]; 
    NSDictionary *detectorOptions = [[NSDictionary alloc] initWithObjectsAndKeys:CIDetectorAccuracyHigh, CIDetectorAccuracy, nil];  
    CIDetector *faceDetector = [CIDetector detectorOfType:CIDetectorTypeFace context:nil options:detectorOptions]; 
    NSArray *features = [faceDetector featuresInImage:image.CIImage]; 
    NSLog(@"Features = %@", features); 
    [self dismissModalViewControllerAnimated:YES]; 
} 

これは、コンパイルし、細かい動作しますが、それは機能の配列にかかわらず、画像に何の常に空です:私はこのコードを使用してカメラで撮影した画像内の顔を検出しようとしていますアイデア?

答えて

22

:あなたがイメージ変数に写真を読み込むと仮定すると、52のコメントを直接Vic320が、私は顔検出用のフロントカメラでプレーしてきた - 私はラウンド行って、フロントカメラで顔をまっすぐに拾うことができなかったのでサークルを丸める...

回転に非常に敏感であることがわかりました。私は自分のiPad2を肖像画にしているとき気づきました。フロントカメラを使用して)私は認識精度が10%未満でした。気まずいところで、それを横向きにして、フロントカメラで100%認識していました。このため

簡単な修正あなたが肖像画に常にフロントカメラを使用している場合は、この小さなスニペットを追加することです:

ポートレートモードで動作するように検出器が強制的に6こと
NSDictionary* imageOptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:6] forKey:CIDetectorImageOrientation]; 
NSArray* features = [detector featuresInImage:image options:imageOptions]; 

。 AppleのSquareCamサンプルには、方向を動的に把握するために必要な場合に、どのような方向であるかを把握するためのユーティリティメソッドが豊富に用意されています。

+0

まだ関連性があります。絶対に輝く –

5

OK、このドキュメントをよくお読みください。 UIImageドキュメントでは、CIImageプロパティの下に「UIImageオブジェクトがCGImageRefを使用して初期化された場合、そのプロパティの値はnilです。」どうやら、UIImagePickerControllerはCGImageRefからイメージを初期化します。なぜなら、このプロパティは実際にはゼロであるからです。私が気づいたもう一つの大きなものは、静止画像からの顔検出は実際には動作しませんということです

NSArray *features = [faceDetector featuresInImage:ciImage]; 

CIImage *ciImage = [CIImage imageWithCGImage:image.CGImage]; 
をして、この行を変更:上記のコードの作業を行うには、追加する必要がありますフロントカメラからの低解像度画像!これは、私がバックの高解像度カメラを使用するたびに機能します。多分アルゴリズムは高解像度のために調整されています...

+0

ありがとうございました。 –

4

以下を試してみてください。私はあなたの@ 14に返信することはできません

NSDictionary *options = [NSDictionary dictionaryWithObject: CIDetectorAccuracyLow forKey: CIDetectorAccuracy]; 
      CIDetector *detector = [CIDetector detectorOfType: CIDetectorTypeFace context: nil options: options]; 

     CIImage *ciImage = [CIImage imageWithCGImage: [image CGImage]]; 
     NSNumber *orientation = [NSNumber numberWithInt:[image imageOrientation]+1]; 
     NSDictionary *fOptions = [NSDictionary dictionaryWithObject:orientation forKey: CIDetectorImageOrientation]; 
      NSArray *features = [detector featuresInImage:ciImage options:fOptions]; 
      for (CIFaceFeature *f in features) { 

       NSLog(@"left eye found: %@", (f. hasLeftEyePosition ? @"YES" : @"NO")); 

       NSLog(@"right eye found: %@", (f. hasRightEyePosition ? @"YES" : @"NO")); 

       NSLog(@"mouth found: %@", (f. hasMouthPosition ? @"YES" : @"NO")); 

       if(f.hasLeftEyePosition) 

        NSLog(@"left eye position x = %f , y = %f", f.leftEyePosition.x, f.leftEyePosition.y); 

       if(f.hasRightEyePosition) 

        NSLog(@"right eye position x = %f , y = %f", f.rightEyePosition.x, f.rightEyePosition.y); 

       if(f.hasMouthPosition) 

        NSLog(@"mouth position x = %f , y = %f", f.mouthPosition.x, f.mouthPosition.y); 

      } 
0

私のために働いた上記の回答なし(iOSの8.4)のiPadミニ& iPadのエア2

私はrobwormaldと同じ観察していました。アプリを回転させたときに顔検出が働いていたので、私はciImage :)

せciImage = CIImage回転(CVPixelBuffer:pixelBuffer、オプション:添付ファイル) LET角= CGFloat(-M_PI/2) せrotatedImage = ciImage.imageByApplyingTransform (CGAffineTransformMakeRotation(angle))