2011-06-10 54 views
1

我拍照使用AVCaptureStillImageOutputAVCaptureSessionAVCaptureVideoPreviewLayer的UIImageView显示。它的工作正常。为什么在没有旋转代码的情况下在OpenCV中旋转图像?

但是,在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

回答

0

您使用UIImageJPEGRepresentation让这些图像出来?如果是这样,那么你可能会感兴趣的:

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

- >“UIImageJPEGRepresentation(),以一个UIImage转换为JPEG最简单的(?唯一的)使用底层CGImage,而忽略你的UIImage imageOrientation,因此无论相机在拍摄照片时的位置如何,导出的JPEG将始终以横向或右侧模式进行定向,最终以需要旋转的照片结束。“

这提示即使您不使用此功能,在使用UIImage时也会考虑隐含imageOrientation

+0

你好benosteen,谢谢你的回复。使用这个,我可以停止旋转吗? – 2011-06-10 14:52:09

+0

我认为,如果你改变'imageOrientation'以符合你的期望 - 'UP'或'RIGHT',我想。我没有iphone sdk/etc进行测试,但该链接上的代码应该可以帮助您测试它​​。 – benosteen 2011-06-10 14:55:39

+0

我已经测试过上面的链接代码。但仍然没有效果。 – 2011-06-10 14:58:19