1

AVCaptureStillImageOutputAVCaptureSession、 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)顔検出方式を呼び出す前の画像 と呼ばれる顔検出方法前の画像

2)顔検出方式を呼び出した後の画像 と呼ばれる顔検出方法後の画像

4

1 に答える 1

0

UIImageJPEGRepresentationを使用してこれらの画像を取り出していますか?もしそうなら、あなたはこれに興味があるかもしれません:

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

-> "UIImageJPEGRepresentation()、UIImageをJPEGに変換する最も簡単な(唯一の?)方法は、基になるCGImageを使用し、UIImage imageOrientationを無視するため、写真が撮影されたときのカメラの位置に関係なく、エクスポートされたJPEGは常に方向付けられます横向きまたは右モードでは、回転が必要な写真になります。」

これは、この関数を使用していない場合でも、を使用するimageOrientationときに考慮すべき暗黙の問題があることを示唆していますUIImage

于 2011-06-10T14:38:45.820 に答える