2013-08-07 83 views
2

我正在使用CIFeature類參考進行人臉檢測,並且我比Core Graphics座標和常規UIKit座標有點困惑。這是我的代碼:CIFaceFeature的座標系

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]; 

} 

這是非常標準。現在根據官方documentation它說:

邊界保存發現的功能的矩形。 (只讀)

討論矩​​形位於圖像的座標系中。

當我直接輸出FaceRect時,得到:get rect {{136,427},{46,46}}。當我應用CGAffineTransfer以正確的方式翻轉它時,我得到的負座標看起來不正確。我正在使用的圖像是在ImageView中。

那麼在哪個座標系中有這些座標?圖片? ImageView?核心圖形座標?常規座標?

回答

3

我終於明白了。正如文檔指出的那樣,由CIFaceFeature繪製的矩形位於圖像的座標系中。這意味着該矩形具有原始圖像的座標。如果選中了Autoresize選項,那意味着圖像會縮小以適合UIImageView。所以你需要將舊的圖像座標轉換爲新的圖像座標。

這個漂亮的代碼塊,我改編自here會替你:

- (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; 
} 
+0

我有同樣的問題所困擾。你能給我完整的代碼鏈接嗎?我不明白在哪裏使用這種方法,以及如何正確應用臉部的矩形。提前致謝。 –