iphone ios avfoundation ios5 core-image

iphone - Problemas para crear UIImage desde CIImage en iOS5



avfoundation core-image (4)

Estoy usando el marco de AVFoundation. En mi delegado de búfer de muestra tengo el siguiente código:

-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection{ CVPixelBufferRef pb = CMSampleBufferGetImageBuffer(sampleBuffer); CIImage *ciImage = [CIImage imageWithCVPixelBuffer:pb]; self.imageView.image = [UIImage imageWithCIImage:ciImage]; }

Puedo usar el CIImage para ejecutar el detector facial, etc., pero no aparece en el UIImageView ... el imageView permanece en blanco. ¿Alguna idea sobre el problema? Estoy usando lo siguiente para configurar mi sesión:

self.session = [[AVCaptureSession alloc] init]; self.session.sessionPreset = AVCaptureSessionPreset640x480; self.videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; self.videoInput = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:nil]; self.frameOutput = [[AVCaptureVideoDataOutput alloc] init]; self.frameOutput.videoSettings = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey];


Aquí hay un ejemplo de código completo que he usado en mis proyectos.

- (UIImage *)makeUIImageFromCIImage:(CIImage *)ciImage { CIContext *context = [CIContext contextWithOptions:nil]; CGImageRef cgImage = [context createCGImage:ciImage fromRect:[ciImage extent]]; UIImage* uiImage = [UIImage imageWithCGImage:cgImage]; CGImageRelease(cgImage); return uiImage; }

CIImage es básicamente una receta para una imagen. Se encontrará con problemas si intenta convertir directamente de CIImage a UIImage . Por ejemplo, llamando

NSData * UIImageJPEGRepresentation ( UIImage *image, CGFloat compressionQuality );

volverá a nil .


Aquí hay una forma en que lo hice funcionar:

CIContext *context = [CIContext contextWithOptions:nil]; CGImageRef ref = [context createCGImage:result fromRect:ciImage.extent]; self.imgView.image = [UIImage imageWithCGImage:ref scale:1.0 orientation:UIImageOrientationRight]; CGImageRelease(ref);

Nota: crear el contexto varias veces es realmente malo y en realidad provoca una pérdida de memoria. ¡Solo debe crear el contexto una vez como propiedad en su instancia de clase y reutilizarlo!


Esto podría ayudar. Estaba teniendo el mismo problema (la imagen no se está dibujando en la pantalla) con este código:

CIImage *image = [[CIImage alloc] initWithImage:[UIImage imageNamed:@"mushroom.jpg"]]; theImageView.image = [UIImage imageWithCIImage:image];

Sin embargo, después de cambiar el código a esto, ahora funciona correctamente:

CIImage *image = [[CIImage alloc] initWithImage:[UIImage imageNamed:@"mushroom.jpg"]]; CIContext *context = [CIContext contextWithOptions:nil]; theImageView.image = [UIImage imageWithCGImage:[context createCGImage:image fromRect:image.extent]];

Para leer más sobre CIContext, eche un vistazo aquí: http://developer.apple.com/library/ios/#DOCUMENTATION/GraphicsImaging/Reference/QuartzCoreFramework/Classes/CIContext_Class/Reference/Reference.html#//apple_ref/occ/cl/CIContext


CIImage *ciImage = [UIImage imageNamed:@"imageName.png"].CIImage; UIImage *uiImage = [[UIImage alloc] initWithCIImage:ciImage];