2013-08-07 4 views
2

저는 CIFeature Class Reference for Face Detection을 사용하고 있습니다. 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를 직접 출력 할 때 다음을 얻습니다. rect {{136, 427}, {46, 46}}. CGAffineTransfer를 올바르게 적용하기 위해 적용 할 때, 나는 옳지 않은 음의 좌표를 얻습니다. 내가 작업하고있는 이미지는 ImageView에 있습니다.

따라서 좌표계는? 이미지? ImageView? 핵심 그래픽 좌표? 정규 좌표?

답변

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

것은 저도 같은 문제로 고민하고 있습니다 :

내가 here에서 적응이 코드 멋진 조각은 당신을 위해 있다고한다. 당신이 당신의 코드의 전체 링크를 줄 수 있습니까? 나는이 방법을 사용하는 곳과 얼굴을 위해 직사각형을 올바르게 적용하는 방법을 이해하지 못한다. 미리 감사드립니다. –