2

私は顔検出に CIFeature Class Reference を使用していますが、Core Graphics 座標と通常の UIKit 座標に少し混乱しています。これは私のコードです:

    UIImage *mainImage = [UIImage imageNamed:@"facedetectionpic.jpg"];

CIImage *image = [[CIImage alloc] initWithImage:mainImage];
NSDictionary *options = [NSDictionary dictionaryWithObject:CIDetectorAccuracyHigh forKey:CIDetectorAccuracy];
CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeFace context:nil options:options];
NSArray *features = [detector featuresInImage:image];

CGRect faceRect;

for (CIFaceFeature *feature in features)
{
    faceRect= [feature bounds];

}

それはかなり標準的です。現在、公式ドキュメントによると、次のように書かれています。

境界 発見された機能を保持する長方形。(読み取り専用)

考察 四角形は画像の座標系にあります。

FaceRect を直接出力すると、get rect {{136, 427}, {46, 46}} になります。CGAffineTransfer を適用して正しい方向に反転すると、正しくないように見える負の座標が得られます。私が扱っている画像はImageViewにあります。

では、これらの座標はどの座標系にあるのでしょうか? 画像?イメージビュー? コアグラフィック座標? いつものコーディネート?

4

1 に答える 1

3

私はついにそれを理解しました。ドキュメントが指摘するように、CIFaceFeature によって描画される四角形は、イメージの座標系にあります。これは、長方形が元の画像の座標を持っていることを意味します。Autoresize オプションがチェックされている場合、それは画像が UIImageView に収まるように縮小されることを意味します。したがって、古い画像座標を新しい画像座標に変換する必要があります。

私がここから適応させたこの気の利いたコードは、あなたのためにそれを行います:

- (CGPoint)convertPointFromImage:(CGPoint)imagePoint {

 CGPoint viewPoint = imagePoint;

 CGSize imageSize = self.setBody.image.size;
 CGSize viewSize  = self.setBody.bounds.size;

 CGFloat ratioX = viewSize.width / imageSize.width;
 CGFloat ratioY = viewSize.height / imageSize.height;

 UIViewContentMode contentMode = self.setBody.contentMode;

  if (contentMode == UIViewContentModeScaleAspectFit)
  {
     if (contentMode == UIViewContentModeScaleAspectFill)
     {
         CGFloat scale;

         if (contentMode == UIViewContentModeScaleAspectFit) {
            scale = MIN(ratioX, ratioY);
         }
         else /*if (contentMode == UIViewContentModeScaleAspectFill)*/ {
            scale = MAX(ratioX, ratioY);
        }

        viewPoint.x *= scale;
        viewPoint.y *= scale;

        viewPoint.x += (viewSize.width  - imageSize.width  * scale) / 2.0f;
        viewPoint.y += (viewSize.height - imageSize.height * scale) / 2.0f;

    }
 }
return viewPoint;
}
于 2013-08-09T10:46:27.640 に答える