2012-02-23 22 views
8

私はUIImageを取り、面だけを含む新しいUIImageを返すルーチンを作成しようとしています。これは非常に簡単なようですが、私の脳はCoreImageとUIImageの空間を巡って問題を抱えています。ここでUIImage顔検出

は基本だ:

- (UIImage *)imageFromImage:(UIImage *)image inRect:(CGRect)rect { 
    CGImageRef sourceImageRef = [image CGImage]; 
    CGImageRef newImageRef = CGImageCreateWithImageInRect(sourceImageRef, rect); 
    UIImage *newImage = [UIImage imageWithCGImage:newImageRef]; 
    CGImageRelease(newImageRef); 
    return newImage; 
} 


-(UIImage *)getFaceImage:(UIImage *)picture { 
    CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeFace 
              context:nil 
              options:[NSDictionary dictionaryWithObject: CIDetectorAccuracyHigh forKey: CIDetectorAccuracy]]; 

    CIImage *ciImage = [CIImage imageWithCGImage: [picture CGImage]]; 
    NSArray *features = [detector featuresInImage:ciImage]; 

    // For simplicity, I'm grabbing the first one in this code sample, 
    // and we can all pretend that the photo has one face for sure. :-) 
    CIFaceFeature *faceFeature = [features objectAtIndex:0]; 

    return imageFromImage:picture inRect:faceFeature.bounds; 
} 

返された画像が反転した画像からです。私はこのような何か使用してfaceFeature.boundsを調整しようとしました:

CGAffineTransform t = CGAffineTransformMakeScale(1.0f,-1.0f); 
CGRect newRect = CGRectApplyAffineTransform(faceFeature.bounds,t); 

を...それは私のイメージ外の結果を提供します。

私はこの問題を解決するための簡単な何かがありますことを確認、しかし下のダウンを計算して、Xとして、これを行うには、「適切な」方法があることを使用して、新しい矩形を作成するための短いんですか?

ありがとうございます!これを達成する簡単な方法はありません

答えて

3

のためにそれをチェック示唆、私はいくつかのコードを書きましたそれを行うには:

CGRect newBounds = CGRectMake(faceFeature.bounds.origin.x, 
           _picture.size.height - faceFeature.bounds.origin.y - largestFace.bounds.size.height, 
           faceFeature.bounds.size.width, 
           faceFeature.bounds.size.height); 

これは魅力的でした。

+5

私は同じことを考えています。あなたがy軸に対して行った計算を教えてください。そして、「最大面」とは何ですか? –

0

は、問題は、iPhoneのカメラからの画像は、ポートレートモードでは常にあるということです、とメタデータの設定が正しく表示するためにそれらを取得するために使用されています。あらかじめ画像の回転を指示しておけば、顔検出の精度が向上します。物事を複雑にするためには、EXIF形式で画像の向きを渡す必要があります。

は幸いにも、このすべてがSquarecamと呼ばれるカバーリンゴのサンプルプロジェクトがあり、私はこれを行うための簡単な方法があるようには思えないので、あなたが詳細

+0

ええ、私はすでに画像の回転に対応しています。私の問題は、UIImageとCGルーチンのさまざまな起源に関連しています。 –

5

それだけでイメージからあなたの顔をトリミングするCIContextを使用する方がはるかに簡単かつ少ない厄介です。このような何か:

CGImageRef cgImage = [_ciContext createCGImage:[CIImage imageWithCGImage:inputImage.CGImage] fromRect:faceFeature.bounds]; 
UIImage *croppedFace = [UIImage imageWithCGImage:cgImage]; 

inputImageとがオブジェクトはあなたがから入手型CIFaceFeatureであるあなたのUIImageオブジェクトとfaceFeatureある[CIDetector featuresInImage:]方法。