2013-11-10 1 views
3

Я пытаюсь обнаружить лицо в UIImageview и разместить изображение во рту. Я пробовал этот метод, но я не могу преобразовать систему координат CoreImage в систему координации UIkit. Вот мой код:обнаружение лица и размещение изображения на нем

код обновляется, но до сих пор не работает, просто вращая Просмотреть

@interface ProcessImageViewController() 

@end 

@implementation ProcessImageViewController 

@synthesize receivedImageData; 
@synthesize renderImageView; 
@synthesize viewToRender; 
@synthesize preview; 
@synthesize pancontrol; 
@synthesize pinchcontrol; 
@synthesize rotatecontrol; 

- (BOOL)prefersStatusBarHidden { 
return YES; 
} 

- (void)viewDidLoad 
{ 


[super viewDidLoad]; 



renderImageView.image = receivedImageData; 
renderImageView.contentMode = UIViewContentModeScaleToFill; 
} 


-(void)tryAddCliparts 
{ 
NSLog(@"button clicked"); 

[self performSelectorInBackground:@selector(markFaces:) withObject:renderImageView]; 

} 


- (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer { 

CGFloat firstX = recognizer.view.center.x; 
CGFloat firstY = recognizer.view.center.y; 

CGPoint translationPoint = [recognizer translationInView:self.view]; 
CGPoint translatedPoint = CGPointMake(firstX + translationPoint.x, firstY+ translationPoint.y); 
CGFloat viewW = renderImageView.frame.size.width; 
CGFloat viewH = renderImageView.frame.size.height; 

if (translatedPoint.x<0 || translatedPoint.x>viewW) 
    translatedPoint.x = renderImageView.frame.origin.x; 

if (translatedPoint.y<0|| translatedPoint.y>viewH) 
    translatedPoint.y = renderImageView.frame.origin.y; 

recognizer.view.center = CGPointMake(translatedPoint.x, translatedPoint.y); 
[recognizer setTranslation:CGPointMake(0, 0) inView:self.view]; 


    } 
- (IBAction)handlePinch:(UIPinchGestureRecognizer *)recognizer { 
recognizer.view.transform = CGAffineTransformScale(recognizer.view.transform, recognizer.scale, recognizer.scale); 
recognizer.scale = 1; 
} 

- (IBAction)handleRotate:(UIRotationGestureRecognizer *)recognizer { 
recognizer.view.transform = CGAffineTransformRotate(recognizer.view.transform, recognizer.rotation); 
recognizer.rotation = 0; 
} 

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 
return YES; 
} 

-(void)markFaces:(UIImageView *)facePicture 
{ 
NSLog(@"face detection started"); 
// draw a ci image from view 
CIImage *image = [CIImage imageWithCGImage:facePicture.image.CGImage]; 


// Create face detector with high accuracy 
CIDetector* detector = [CIDetector detectorOfType:CIDetectorTypeFace 
              context:nil options:[NSDictionary dictionaryWithObject:CIDetectorAccuracyHigh forKey:CIDetectorAccuracy]]; 


CGAffineTransform transform = CGAffineTransformMakeScale(1, -1); 
transform = CGAffineTransformTranslate(transform, 
             0,-facePicture.bounds.size.height); 

    // Get features from the image 
    NSArray* features = [detector featuresInImage:image]; 
    for(CIFaceFeature* faceFeature in features) { 



    // Transform CoreImage coordinates to UIKit 
    CGRect faceRect = CGRectApplyAffineTransform(faceFeature.bounds, transform); 


       UIImage *mustache = [UIImage imageNamed:@"mustacheok.png"]; 

       UIImageView *mustacheview = [[UIImageView alloc] initWithImage:mustache]; 


       mustacheview.contentMode = UIViewContentModeScaleAspectFill; 
       [mustacheview.layer setBorderColor:[[UIColor whiteColor] CGColor]]; 
       [mustacheview.layer setBorderWidth:3]; 
       [mustacheview addGestureRecognizer:pancontrol]; 
       [mustacheview addGestureRecognizer:pinchcontrol]; 
       [mustacheview addGestureRecognizer:rotatecontrol]; 
       mustacheview.userInteractionEnabled=YES; 

        CGPoint mouthPos = CGPointApplyAffineTransform(faceFeature.mouthPosition, transform); 


       [mustacheview setFrame:CGRectMake(mouthPos.x, mouthPos.y,  mustacheview.frame.size.width, mustacheview.frame.size.height)]; 

    [viewToRender addSubview:mustacheview]; 
    [viewToRender bringSubviewToFront:mustacheview]; 



} 

} 




@end 
+0

>, когда я не могу преобразовать систему CoreImage координационную для UIKit системы координации. Что это значит? –

+0

Извините, я ошибся, я имею в виду, когда я добавляю изображение с этими координатами для просмотра, изображение помещается неправильно. –

+0

Что такое viewToRender? – jcesarmobile

ответ

1
CGAffineTransform transform = CGAffineTransformMakeScale(1, -1); 
transform = CGAffineTransformTranslate(transform, 
             0,-facePicture.bounds.size.height); 
for (CIFaceFeature *faceFeature in features) { 

    // Transform CoreImage coordinates to UIKit 
    CGRect faceRect = CGRectApplyAffineTransform(faceFeature.bounds, transform); 

    if (faceFeature.hasMouthPosition) { 

     // Transform CoreImage coordinates to UIKit 
     CGPoint mouthPos = CGPointApplyAffineTransform(faceFeature.mouthPosition, transform); 

    } 

} 

единственное, что я вижу неправильно в вашем коде это:

[mustacheview setFrame:CGRectMake(mouthPos.x, mouthPos.y,  mustacheview.frame.size.width, mustacheview.frame.size.height)]; 

вы должны использование:

[mustacheview setCenter:mouthPos]; 

becau se детектор возвращает центральную точку рта.

+0

что такое переменная преобразования? –

+0

Извините, отредактированный ответ – jcesarmobile

+0

, поэтому я попробовал, и он поворачивает изображение на 180 градусов. Кроме того, переменная faceRect - это лицо Rectangle. мне нужно положение рта :( пс, если изображение масштабируется мне нужно, чтобы определить масштаб и каким-то образом умножить координаты –

0

CoreImage использует ту же систему координат, что и CoreGraphics, нижнюю левую систему координат, а не верхнюю левую систему координат UIKit.

Таким образом, вы в основном должны щелкнуть по Y-оси (умножить на -1 и смещение высоты экрана)

CGAffineTransformation flipVertical = 
     CGAffineTransformMake(1, 0, 0, -1, 0, self.bounds.size.height);