iOSのプログラミングについて備忘録的に書いていこうと思います。
最終的には、AVFoundation を使用してリアルタイム顔認識したいです。
まずは、CoreImageを使ってフィルターの勉強をするために
以下のサイトを参考にさせていただきました。
・iPhoneカメラアプリ開発入門(第一回)
実装方法の詳細は上記サイトの通りなので、
CIFilterを作成する際にちょっと一工夫。
/** 画像に指定されたフィルタを適用する */ + (UIImage *)adhibitionFilter:(UIImage *)image withFilter:(TImageFilters)type { if (type == TImageFilterNone) { return image; } // CoreImageFilterを作成する CIFilter *filter = [[self class] createFilterWithType:type intensity:1.0f targetImage:image]; // coreimageコンテクストを作成 CIContext *ciContext = [CIContext contextWithOptions:nil]; // フィルタを適用 CGImageRef cgImage = [ciContext createCGImage:filter.outputImage fromRect:[filter.outputImage extent]]; // UIImageに変換 UIImage *retImage = [UIImage imageWithCGImage:cgImage scale:image.scale orientation:UIImageOrientationUp]; CGImageRelease(cgImage); return retImage; } /** フィルターを生成する */ + (CIFilter *)createFilterWithType:(TImageFilters)type intensity:(CGFloat)intensity targetImage:(UIImage *)image { CIImage *ciImage = [[CIImage alloc] initWithImage:image]; // CoreImageFilterを作成する CIFilter *filter = [CIFilter filterWithName:[[self class] createFilterNameWithType:type]]; [filter setValue:ciImage forKey:kCIInputImageKey]; /** ### */ /** パラメータを動的に生成して、どんなフィルタ名にも対応できるようにしています */ /** ### */ NSDictionary *params = [[self class] createFilterParametarWithType:type]; NSArray *keys = [params allKeys]; for (NSString *key in keys) { /** フィルタに存在しないパラメータの場合は設定しない */ if ([filter respondsToSelector:NSSelectorFromString(key)] == NO) { continue; } [filter setValue:[params objectForKey:key] forKey:key]; } return filter; } /** フィルタータイプにあったフィルタ名を生成する */ + (NSString *)createFilterNameWithType:(TImageFilters)type { NSString *name = nil; switch (type) { case TImageFilterMonochrome: case TImageFilterMonoSepia: name = kFilterNameMonochrome; break; case TImageFilterSepiaTone: name = kFilterNameSepiaTone; break; case TImageFilterNone: default: name = nil; break; } return name; } /** フィルタータイプにあったパラメータを生成する */ + (NSDictionary *)createFilterParametarWithType:(TImageFilters)type { NSMutableDictionary *params = [[NSMutableDictionary alloc] init]; // CIFilterに指定するパラメータ名 NSString * const keyInputColor = @"inputColor"; NSString * const keyInputIntensity = @"inputIntensity"; switch (type) { case TImageFilterMonochrome: case TImageFilterMonoSepia: // パラメータ:入力色(RGBのフィルタ係数) [params setObject:[[self class] createCIColorWithType:type] forKey:keyInputColor]; // パラメータ:適用度 (0.5で半分になる) [params setObject:[NSNumber numberWithFloat:1.0f] forKey:keyInputIntensity]; break; case TImageFilterSepiaTone: // パラメータ:適用度 (0.5で半分になる) [params setObject:[NSNumber numberWithFloat:1.0f] forKey:keyInputIntensity]; break; case TImageFilterNone: default: break; } return params; }
実行結果は以下のとおりです。
UIPickerView を使ってフィルターを動的に選択できるようにしています。
・フィルター無し
・モノクロ
・セピア(CIColorMonochromeフィルタ)
次回は、AVFoundation についての勉強か iOS Dev Program に登録します。