以前書いた記事で、UIImage.imageOrientationがどんな状態でも、一度UIImageで書き直してしまえば問題ないと書いたんですが、やはりうまくいかないので、色々検索していたら見つけました。
featuresInImageで顔検出する際に、画像の向きを渡してやらないといけないらしい。optionは既に設定していたので見落としていたのですが・・・
//オプション辞書作成(顔検出の精度/高精度) NSDictionary *options = [NSDictionary dictionaryWithObject:CIDetectorAccuracyHigh forKey:CIDetectorAccuracy]; //CIDetectorを生成(画像解析/現在は顔検出のみ指定可能) CIDetector *faceDetector = [CIDetector detectorOfType:CIDetectorTypeFace context:_imageContext options:options];
↑ここで指定するoptionは、検出の精度。
//顔検出(位置情報を配列で返す)>画像向きのオプションを追加 NSInteger orentation = [self exifOrientation:_originalImage]; NSDictionary *imageOptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:orentation] forKey:CIDetectorImageOrientation]; NSArray *faces = [faceDetector featuresInImage:coreImage options:imageOptions];
↑ここで指定するoptionは、検出に使用する画像の向き。
ということらしいです。
画像の向きの取得は、参考サイトに習って関数化(exifOrientation:_originalImage)してあります。
これでようやく、iPhoneのどの向きで撮影しても、ちゃんと顔検出が出来るようになりました。
よく見たら、前回の記事で参考にしたサイトにも記述があるのですが、特定の数値を指定していたりで、よくわかっていませんでした。
参考:
まみったー iPhone の向きと UIImageOrientation メモ
iOS 5のCIDetectorを使って顔認識してみた
笑顔やまばたきも!iPhoneカメラでカンタン顔認識
テスト環境:iPhone5+Xcode 5.1.1
「iOSの顔検出を画像で表示する(2)」への1件のフィードバック
コメントは停止中です。