2017-10-04 9 views
0

私はXcode9でAppleがリリースした新しいVision Frameworkを探求するために、下のリンクで入手できるXcodeプロジェクトを作成しました。私はGitHubとYoutubeの両方で見つかったコードに基づいて調整しましたが、VNImageRequestHandlerのorientationパラメータにCGImagePropertyOrientation.rightがなぜ必要なのか理解できません。誰かがこれに光を当てることができますか?なぜ顔検出はC​​GImagePropertyOrientation.rightでのみ機能しますか?

GitHub Xcode project

答えて

0

私はUIImage.imageOrientationとCGImagePropertyOrientationにAppleのドキュメントを通して行く自分の質問府への答えを見つけました。 これらのプロパティの両方が画像の向きに関連していますが、実際の値はそれぞれのエナメルタイトに割り当てられています。たとえば、UIImage.imageOrientation.upは値0にマップされ、CGImagePropertyOrientation.upは1にマップされます。私がそれを使用する方法は、UIImage.imageOrientation入力からのマッピングを返すこのカスタムの「翻訳」機能を構築することです対応するCGImagePropertyOrientation値:

func getCGOrientationFromUIImage(_ image: UIImage) -> CGImagePropertyOrientation { 
    // returns que equivalent CGImagePropertyOrientation given an UIImage. 
    // This is required because UIImage.imageOrientation values don't match to CGImagePropertyOrientation values 
    switch image.imageOrientation { 
    case .down: 
     return .down 
    case .left: 
     return .left 
    case .right: 
     return .right 
    case .up: 
     return .up 
    case .downMirrored: 
     return .downMirrored 
    case .leftMirrored: 
     return .leftMirrored 
    case .rightMirrored: 
     return .rightMirrored 
    case .upMirrored: 
     return .upMirrored 
    } 
} 

GitHubサンプルが更新されました。写真を撮影するために使用される向きに関係なく、現在の顔が認識されます。

よろしくお願いいたします。

+0

UInt32(CGImagePropertyOrientation)を提供する予定のInt(imageOrientationから)を使用しようとしているため、これは機能しません。この場合、コンパイラはエラーをスローします。 –

+0

Appleのサンプルコードには、同じ変換が可能な拡張機能があります。 https://developer.apple.com/documentation/vision/classifying_images_with_vision_and_core_ml –

+1

'拡張UIImageOrientation { するvar cgImagePropertyOrientation:CGImagePropertyOrientation { スイッチ自己{ 場合.down: 場合.downリターン.LEFT: リターンケース.LEFT .RIGHT: リターンケースを.up .RIGHT: 場合は.downMirrored リターン.up: リターンケース.rightMirrored .leftMirrored: リターン場合は.leftMirrored .downMirrored リターンは0 .rightMirroredケース。upMirrored:CGImagePropertyOrientation { スイッチimageOrientation { 場合.down: 戻り.down リターン }} } ' –

1

顔を検出するには、顔の向きを知る必要があります。顔の向きは、通常、画像の意図した表示方向に一致します。 (ほとんどの人は、ほとんどの場合、顔が正面を向いている写真を撮ります)ほとんどの顔検出ソフトウェア、Visionが含まれています。右上の顔を探すために最適化されています。任意の向きの顔を探しているときに偽陽性です。

Visionの顔検出機能では、向きを指定することをお勧めします。 AFAICT指定しない場合は、デフォルトの.upが使用されます。 .rightが指定された方向である場合にのみ正しく認識する画像がある場合、それらの画像には、好みの表示方向が、取り込まれた固有のセンサー方向と必ずしも同じではないことを示すEXIFメタデータが含まれている可能性があります。

あなたのイメージは、ストレージ/ URLからロードUIImageとして起動している場合は、その意図した表示方向がUIImageOrientationであるもののイメージを尋ね、とビジョンメソッドに渡すためCGImagePropertyOrientationにそれを変換することができます。 AppleのVision sample codeでこれを行う方法があります。

関連する問題