Зачем вращать изображение в OpenCV без кода поворота? - PullRequest
1 голос
/ 10 июня 2011

Я делаю фотографию, используя AVCaptureStillImageOutput , AVCaptureSession , AVCaptureVideoPreviewLayer и отображаю ее в UIImageView . Его работа правильно.

Но, после отображения изображения в UIImage. Я обнаруживаю лица, используя OpenCV по отображаемому изображению.

Обнаруживает, но возвращает повернутое изображение. Я не использую код для поворота изображения. Его автоматически поворачивать изображение.

Я хочу прекратить вращаться.

Вот мой код.

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

Вот скриншоты

1) Изображение до вызова метода определения лица Image before face detection method called

2) Изображение после вызова метода определения лица Image after face detection method called

1 Ответ

0 голосов
/ 10 июня 2011

Используете ли вы UIImageJPEGRepresentation, чтобы получить эти изображения? Если это так, то вас это может заинтересовать:

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

-> "UIImageJPEGRepresentation (), самый простой (только?) Способ преобразования UIImage в JPEG, использует базовый CGImage и игнорирует ваше UIImage imageOrientation, поэтому независимо от положения камеры, когда было сделано изображение, экспортированный JPEG будет всегда ориентируйтесь в альбомном или правильном режиме, заканчивая картинками, которые нуждаются в повороте. "

Это намекает на то, что даже если вы не используете эту функцию, есть неявный imageOrientation, который следует учитывать при использовании UIImage.

...