Frage

Ich mache ein Foto mithilfe AvcapturestillimageOutput, AvcaptureSession, AvcapturevideopreviewLayer und anzeigen in UIImageView. Seine Arbeit ordnungsgemäß.

Aber nach der Anzeige Bild in UIImage. Ich erkenne Gesichter mit OpenCV aus diesem angezeigten Bild.

Es erkennt, aber es gibt das gedrehte Bild zurück. Ich verwende keinen Code zum Drehen des Bildes. Es dreht das Bild automatisch.

Ich möchte aufhören zu drehen.

Hier ist mein 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;
}

Hier sind die Screenshots

1) Bild für die Methode zur Erkennung von GesichtserkennungImage before face detection method called

2) Bild für nach dem Aufrufen der GesichtserkennungsmethodeImage after face detection method called

War es hilfreich?

Lösung

Verwenden Sie UIImageJpegRepreSentation, um diese Bilder herauszuholen? Wenn ja, dann sind Sie möglicherweise daran interessiert:

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

-> "UIImagejpegRepesentation (), der einfachste (nur?), Um eine UIimage in ein JPEG umzuwandeln, verwendet das zugrunde liegende CGIMage In der Landschaft oder im rechten Modus enden mit Bildern, die eine Rotation benötigen. "

Dies deutet darauf hin, dass selbst wenn Sie diese Funktion nicht verwenden, ein implizites gibt imageOrientation bei der Verwendung zu berücksichtigen UIImage.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top