2

我正在尝试使用 GPUImage 框架的色键过滤器。我遵循了 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];

所以camera和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

4 回答 4

3

经过几天的尝试找到了这个宝石...... 显然你应该坚持(强参考)GPUImagePicture。我的印象是过滤器链内部会有很强的参考,但事实并非如此。将其保留为实例 var 解决了该问题。

于 2012-11-21T18:22:38.293 回答
1

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

混合采用两个源图像,并用第二个图像中的像素替换与第一个图像中的键控颜色匹配的像素。常规色度键控过滤器只是将与目标颜色匹配的像素的 alpha 通道减少到 0.0,它不会混合到另一个图像中。

于 2012-11-20T16:29:48.910 回答
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);

现在,视频中的所有键控(例如绿色)像素都变得透明,并显示过滤器视图下方的任何内容,包括。(现场)视频。

于 2013-04-23T12:10:44.203 回答
0

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

这对我有用

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

希望有帮助。

于 2012-11-19T18:27:40.830 回答