2011-06-10 4 views
1

Je prends photo à l'aide AVCaptureStillImageOutput, AVCaptureSession, AVCaptureVideoPreviewLayer et l'afficher dans UIImageView. Son travail correctement.Pourquoi faire pivoter Image dans OpenCV sans code de rotation?

Mais, Après l'affichage de l'image dans UIImage. Je détecte des visages en utilisant OpenCV à partir de cette image affichée.

Il détecte, mais il renvoie l'image pivotée. Je n'utilise aucun code pour faire pivoter l'image. Il fait automatiquement pivoter l'image.

Je veux arrêter de tourner.

Voici mon code.

+ (UIImage *) opencvFaceDetect:(UIImage *)originalImage { 
    cvSetErrMode(CV_ErrModeParent); 

    IplImage *image = [self CreateIplImageFromUIImage:originalImage]; 

    // Scaling down 
    IplImage *small_image = cvCreateImage(cvSize(image->width/2,image->height/2), IPL_DEPTH_8U, 3); 
    cvPyrDown(image, small_image, CV_GAUSSIAN_5x5); 
    int scale = 2; 

    // Load XML 
    NSString *path = [[NSBundle mainBundle] pathForResource:@"haarcascade_frontalface_default" ofType:@"xml"]; 
    CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade*)cvLoad([path cStringUsingEncoding:NSASCIIStringEncoding], NULL, NULL, NULL); 
    CvMemStorage* storage = cvCreateMemStorage(0); 

    // Detect faces and draw rectangle on them 
    CvSeq* faces = cvHaarDetectObjects(small_image, cascade, storage, 1.2f, 2, CV_HAAR_DO_CANNY_PRUNING, cvSize(20, 20), cvSize(100, 100)); 
    cvReleaseImage(&small_image); 

    NSLog(@"found %d faces in image", faces->total); 

    // Create canvas to show the results 
    CGImageRef imageRef = originalImage.CGImage; 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef contextRef = CGBitmapContextCreate(NULL, originalImage.size.width, originalImage.size.height, 8, originalImage.size.width * 4, 
                colorSpace, kCGImageAlphaPremultipliedLast|kCGBitmapByteOrderDefault); 
    CGContextDrawImage(contextRef, CGRectMake(0, 45, originalImage.size.width, originalImage.size.height), imageRef); 

    CGContextSetLineWidth(contextRef, 4); 
    CGContextSetRGBStrokeColor(contextRef, 0.0, 0.0, 1.0, 0.5); 

    // Draw results on the iamge 
    for(int i = 0; i < faces->total; i++) { 
     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

     // Calc the rect of faces 
     CvRect cvrect = *(CvRect*)cvGetSeqElem(faces, i); 
     CGRect face_rect = CGContextConvertRectToDeviceSpace(contextRef, 
           CGRectMake(cvrect.x * scale, cvrect.y * scale, cvrect.width * scale, cvrect.height * scale)); 
     CGContextStrokeRect(contextRef, face_rect); 

     [pool release]; 
    } 

    UIImage *returnImage = [UIImage imageWithCGImage:CGBitmapContextCreateImage(contextRef)]; 
    CGContextRelease(contextRef); 
    CGColorSpaceRelease(colorSpace); 

    cvReleaseMemStorage(&storage); 
    cvReleaseHaarClassifierCascade(&cascade); 

    return returnImage; 
} 

Voici les captures d'écran

1) l'image pour avant d'appeler la méthode de détection de visage Image before face detection method called

2) l'image pour après avoir appelé la méthode de détection de visage Image after face detection method called

Répondre

0

Êtes-vous à l'aide UIImageJPEGRepresentation pour sortir ces images? Si oui, alors vous pourriez être intéressé par ceci:

http://blog.logichigh.com/2008/06/05/uiimage-fix/

-> « UIImageJPEGRepresentation(), le plus (? Seulement) façon de convertir un UIImage à un JPEG utilise le CGImage sous-jacente, et ne tient pas compte de votre UIImage imageOrientation, donc indépendamment de la position de la caméra lorsque la photo a été prise, le JPEG exporté sera toujours orienté en mode paysage ou droit, se terminant par des images qui ont besoin de rotation. "

Ceci indique que même si vous n'utilisez pas cette fonction, il faut prendre en compte un imageOrientation implicite lors de l'utilisation de UIImage.

+0

Bonjour benosteen, Merci pour votre réponse. En utilisant ceci, puis-je arrêter de tourner? –

+0

Je crois que si vous changez le 'imageOrientation' pour correspondre à ce que vous attendez -' 'UP'' ou' 'DROIT '' je pense. Je n'ai pas un iphone sdk/etc pour tester, mais le code sur ce lien devrait vous aider à le tester. – benosteen

+0

J'ai testé ci-dessus le code lien. Mais toujours pas d'effet. –

Questions connexes