GPUImage色度键过滤器

时间:2012-11-19 18:10:57

标签: objective-c ios cocoa-touch gpuimage

我正在尝试使用GPUImage框架的chromakey过滤器。我按照Filtershowcase示例,但显然我错过了一些东西,因为它只显示视频,但没有绿屏键控效果。这是我对摄像机/过滤器的初始化:

camera = [[GPUImageStillCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480
                                             cameraPosition:AVCaptureDevicePositionBack];
camera.outputImageOrientation = UIInterfaceOrientationLandscapeLeft;
camera.horizontallyMirrorFrontFacingCamera = NO;
camera.horizontallyMirrorRearFacingCamera = NO;


chromaKeyFilter = [[GPUImageChromaKeyFilter alloc] init];
chromaKeyFilter.thresholdSensitivity = sliderThres.value;

UIImage *inputImage = [UIImage imageNamed:@"WID-small.jpg"];


GPUImagePicture *sourcePicture = [[GPUImagePicture alloc] initWithImage:inputImage
                                                    smoothlyScaleOutput:YES];


[camera addTarget:chromaKeyFilter];
[sourcePicture addTarget:chromaKeyFilter];
[sourcePicture processImage];

[chromaKeyFilter addTarget:viewCamera];


[camera startCameraCapture];

所以摄像头和sourcePicture都进入过滤器,过滤器进入viewCamera。但是现在,我只看到普通的视频,没有抠像效果。 (我有一个改变阈值的滑块)。

使用GPUImageChromaKeyBlendFilter

更新

camera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack];
camera.outputImageOrientation = UIInterfaceOrientationLandscapeLeft;
chromaKeyFilter = [[GPUImageChromaKeyBlendFilter alloc] init];


UIImage *inputImage;
inputImage = [UIImage imageNamed:@"WID-small.jpg"];
GPUImagePicture *sourcePicture = [[GPUImagePicture alloc] initWithImage:inputImage smoothlyScaleOutput:YES];


[camera addTarget:chromaKeyFilter];
[sourcePicture processImage];
[sourcePicture addTarget:chromaKeyFilter];
[chromaKeyFilter addTarget:viewCamera];

[camera startCameraCapture];

使用此过滤器,只需将其替换为黑色,而不是实际图像。

4 个答案:

答案 0 :(得分:3)

Found this gem after a couple of days of trying....。显然你应该坚持(强参考)GPUImagePicture。我的印象是内部的过滤器链会有很强的参考,但情况并非如此。保持它作为实例var解决了问题。

答案 1 :(得分:1)

我认为您需要GPUImageChromaKeyBlendFilter,而不是GPUImageChromaKeyFilter。

混合接收两个源图像,并将与第一图像中的键控颜色匹配的像素替换为来自第二图像的像素。常规色度键控滤镜简单地将匹配目标颜色的像素的alpha通道缩小为0.0,它不会混合到另一个图像中。

答案 2 :(得分:1)

与原始问题类似,我想在自定义视图层次结构上添加绿屏视频。直播视频。事实证明,使用标准的GPUImage ChromaKey过滤器是不可能的。它不是alpha混合,而是将绿色像素与背景像素混合在一起。例如,红色背景变为黄色,蓝色变为青色。

让它运作的方法包括两个步骤:

1)确保filterview具有透明背景:

filterView.backgroundColor=[UIColor clearColor];

2)修改GPUImageChromaKeyFilter.m

old: gl_FragColor = vec4(textureColor.rgb, textureColor.a * blendValue);

new: gl_FragColor = vec4(textureColor.rgb * blendValue, 1.0 * blendValue);

现在,视频中的所有键控(例如绿色)像素都变得透明,并且可以发现滤镜视图下方的任何内容,包括(在线 - )视频。

答案 3 :(得分:0)

您是否设置了滑块的目标和选择器?

这对我有用

[(GPUImageChromaKeyFilter *)filter setThresholdSensitivity:[(UISlider *)sender value]];
        [image setImage:[filter imageByFilteringImage:sourceImage]];

希望有所帮助。