5

組み込みの iOS 5 顔検出 API を実装しようとしています。のインスタンスを使用してユーザーが写真を撮れるようにしてから、顔の特徴を検出するためUIImagePickerControllerに使用しようとしています。CIDetector残念ながら、featuresInImage常にサイズ 0 の配列を返します。

コードは次のとおりです。

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
UIImage* picture = [info objectForKey:UIImagePickerControllerOriginalImage];

NSNumber *orientation = [NSNumber numberWithInt:
                         [picture imageOrientation]];
NSDictionary *imageOptions =
[NSDictionary dictionaryWithObject:orientation
                            forKey:CIDetectorImageOrientation];

CIImage *ciimage = [CIImage imageWithCGImage:[picture CGImage]
                                     options:imageOptions];


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

NSArray *features = [detector featuresInImage:ciimage];
NSLog(@"Feature size: %d", features.count);
}

これは常に 0 の特徴を返します。ただし、アプリケーションに組み込まれているファイルから UIImage を使用すると、顔検出はうまく機能します。

このPragmatic Bookshelf の記事のコードを使用しています。

価値があるのは、UIImageをカメラからCIImageに変換するときのエラーだと思いますが、何でもかまいません。

4

4 に答える 4

19

@tonycあなたのソリューションは、「UIImageOrientationRight」という特定のケースでのみ機能します。この問題は、UIImage と CIDetectorImageOrientation の向きの違いから発生します。iOS ドキュメントから:

CIDetectorImageOrientation

特徴を検出する画像の表示方向を指定するために使用するキー。このキーは、TIFF および EXIF 仕様で定義されているものと同じ値を持つ NSNumber オブジェクトです。値の範囲は 1 ~ 8 です。値は、イメージの原点 (0,0) がどこにあるかを指定します。存在しない場合、デフォルト値は 1 で、画像の原点が左上であることを意味します。各値で指定される画像の原点の詳細については、kCGImagePropertyOrientation を参照してください。

iOS 5.0 以降で利用できます。

CIDetector.h で宣言されています。

したがって、問題はこれら2つの方向間の変換です。これが私のコードで行ったことであり、テストしたところ、すべての方向で機能しました。

int exifOrientation;
switch (self.image.imageOrientation) {
    case UIImageOrientationUp:
        exifOrientation = 1;
        break;
    case UIImageOrientationDown:
        exifOrientation = 3;
        break;
    case UIImageOrientationLeft:
        exifOrientation = 8;
        break;
    case UIImageOrientationRight:
        exifOrientation = 6;
        break;
    case UIImageOrientationUpMirrored:
        exifOrientation = 2;
        break;
    case UIImageOrientationDownMirrored:
        exifOrientation = 4;
        break;
    case UIImageOrientationLeftMirrored:
        exifOrientation = 5;
        break;
    case UIImageOrientationRightMirrored:
        exifOrientation = 7;
        break;
    default:
        break;
}

NSDictionary *detectorOptions = @{ CIDetectorAccuracy : CIDetectorAccuracyHigh }; // TODO: read doc for more tuneups
CIDetector *faceDetector = [CIDetector detectorOfType:CIDetectorTypeFace context:nil options:detectorOptions];

NSArray *features = [faceDetector featuresInImage:[CIImage imageWithCGImage:self.image.CGImage]
                                          options:@{CIDetectorImageOrientation:[NSNumber numberWithInt:exifOrientation]}];
于 2013-06-10T07:47:50.793 に答える
2

案の定、これを調べて困惑した1日を過ごした後、私はこれを投稿してから1時間後に解決策を見つけました。

やがて、顔検出は横向きでは機能するが、縦向きでは機能しないことに気づきました。

私はこれらのオプションが必要だったことがわかりました:

NSDictionary *imageOptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:6]
                                                         forKey:CIDetectorImageOrientation];
NSArray *features = [detector featuresInImage:ciimage options:imageOptions];
于 2012-05-25T00:28:08.413 に答える
1

Swift 3 バージョン

var exifOrientation : Int
switch (inputImage.imageOrientation)
{
case UIImageOrientation.up:
    exifOrientation = 1;
case UIImageOrientation.down:
    exifOrientation = 3;
case UIImageOrientation.left:
    exifOrientation = 8;
case UIImageOrientation.right:
    exifOrientation = 6;
case UIImageOrientation.upMirrored:
    exifOrientation = 2;
case UIImageOrientation.downMirrored:
    exifOrientation = 4;
case UIImageOrientation.leftMirrored:
    exifOrientation = 5;
case UIImageOrientation.rightMirrored:
    exifOrientation = 7;
}

let ciImage = CIImage(cgImage: inputImage.cgImage!)
let options = [CIDetectorAccuracy: CIDetectorAccuracyHigh]
let faceDetector = CIDetector(ofType: CIDetectorTypeFace, context: nil, options: options)!
let faces = faceDetector.features(in: ciImage, options:["CIDetectorImageOrientation":exifOrientation])
于 2017-03-28T22:28:06.083 に答える