2013-06-05 3 views
1

Я использую AVFoundation для воспроизведения видео, создавая CGImage из AVFoundation обратного вызова, создавая UIImage из CGImage, а затем отображения UIImage в UIImageView.UIImage цветокоррекция

Я хочу применить некоторую коррекцию цвета к изображениям, прежде чем отображать их на экране. Каков наилучший способ раскрасить изображения, которые я получаю?

Я попытался с помощью CIFilters, но это требует, чтобы я первым создать CIImage из AVFoundation, затем Colorise его, а затем создать CGImage, а затем создать UIImage, и я предпочел бы избежать дополнительный шаг создания CIImage если возможное.

Кроме того, не кажется, что производительность CIFilters достаточно быстра - по крайней мере, не тогда, когда необходимо создать дополнительный CIImage. Любые предложения относительно более быстрого способа сделать это?

Заранее спасибо.

+1

Вы взглянули a рамки GPUImage? Он не заставит вас отказаться от использования промежуточных форматов, но фильтры в большинстве случаев работают немного быстрее, чем CIFilters. https://github.com/BradLarson/GPUImage –

+0

Похоже на довольно классную библиотеку в целом, но не думаю, что она будет делать то, что мне нужно, так как мне нужно распознавание лица AVFoundation, а также коррекцию цвета. – Liron

ответ

1

Похоже, что использование EAGLContext вместо стандарта CIContext является ответом. Это дает достаточно быструю производительность при создании раскрашенных изображений для моих нужд.

Простой пример кода здесь:

На Init:

NSMutableDictionary *options = [[NSMutableDictionary alloc] init]; 
[options setObject: [NSNull null] forKey: kCIContextWorkingColorSpace]; 
m_EAGLContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; 
m_CIContext = [CIContext contextWithEAGLContext:m_EAGLContext options:options]; 

Установите цвет:

-(void)setColorCorrection:(UIColor*)color 
{ 
    CGFloat r,g,b,a; 
    [color getRed:&r green:&g blue:&b alpha:&a]; 

    CIVector *redVector = [CIVector vectorWithX:r Y:0 Z:0]; 
    CIVector *greenVector = [CIVector vectorWithX:0 Y:g Z:0]; 
    CIVector *blueVector = [CIVector vectorWithX:0 Y:0 Z:b]; 

    m_ColorFilter = [CIFilter filterWithName:@"CIColorMatrix"]; 
    [m_ColorFilter setDefaults]; 
    [m_ColorFilter setValue:redVector forKey:@"inputRVector"]; 
    [m_ColorFilter setValue:greenVector forKey:@"inputGVector"]; 
    [m_ColorFilter setValue:blueVector forKey:@"inputBVector"]; 
} 

На каждом видеокадра:

CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 
CVPixelBufferLockBaseAddress(pixelBuffer, 0); 
CGImageRef cgImage = nil; 

CIImage *ciImage = [CIImage imageWithCVPixelBuffer:pixelBuffer]; 

[m_ColorFilter setValue:ciImage forKey:kCIInputImageKey]; 
CIImage *adjustedImage = [m_ColorFilter valueForKey:kCIOutputImageKey]; 

cgImage = [m_CIContext createCGImage:adjustedImage fromRect:ciImage.extent]; 
Смежные вопросы