Question

Je prends photo à l'aide AVCaptureStillImageOutput , AVCaptureSession , AVCaptureVideoPreviewLayer et l'afficher dans UIImageView . Son travail correctement.

Mais, après l'image d'affichage dans UIImage. Je détecte les visages en utilisant OpenCV de cette image affichée.

Il détecte, mais il renvoie l'image pivotée. Je n'utilise un code pour pivoter l'image. Sa rotation automatique de 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) pour l'image avant d'appeler le visage méthode de détection image avant la méthode de détection de visage appelée

2) pour l'image après avoir appelé la méthode de détection de visage Image après la méthode de détection de visage appelée

Était-ce utile?

La solution

Utilisez-vous UIImageJPEGRepresentation pour obtenir ces images sur? 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 quelle que soit la position de la caméra lorsque l'image a été prise le JPEG exporté toujours être orienté en mode paysage ou droit, de se retrouver avec des images que la rotation de besoin ».

Ceci laisse présager que même si vous ne l'utilisez cette fonction, il y a une imageOrientation implicite à considérer lors de l'utilisation UIImage.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top