使用GPUImage进行色彩滤镜视频处理?

3
我正在尝试使用透明度关键字(RGB: 0x00FF00,或者深绿色)在我的应用程序中展示一个带有透明度的视频文件,使用@BradLarson的很棒的GPUImage工具包。但是,我在使用GPUImageChromaKeyFilter过滤器时遇到了一些困难,而且我不太明白为什么会这样。

我的源视频文件可以在我的Dropbox这里获得(12千字节,3秒长,全绿背景,在屏幕上只有一个正方形),

我使用了名为SimpleVideoFilter的示例项目。

这是我尝试使用的代码(我只是替换了-viewDidLoad):

NSURL *sampleURL = [[NSBundle mainBundle] URLForResource:@"sample" withExtension:@"m4v"];
movieFile = [[GPUImageMovie alloc] initWithURL:sampleURL];

filter = [[GPUImageChromaKeyFilter alloc] init];
[filter setColorToReplaceRed:0 green:1 blue:0];
[filter setEnabled:YES];

[movieFile addTarget:filter];

GPUImageView *filterView = (GPUImageView *)self.view;
[filter addTarget:filterView];

[movieFile startProcessing];

根据文档(内容很少),这个操作应该会把视频中所有的绿色替换掉。但实际输出的结果是这样的:Screenshot of video。这告诉我视频正在播放(因此正在传输到应用程序),但似乎没有进行任何色度键控。这是为什么呢?我需要手动设置平滑值和阈值吗?不应该,因为源只包含两种颜色(0x00FF000x000000)。
我已经在设备上测试过了,但没有成功。我试图使用的几乎所有其他过滤器都有效,比如GPUImageRGBFilterGPUImageSepiaFilter等。难道说GPUImageChromaKeyFilter有问题吗?
如果有人能帮忙解决这个问题,我将不胜感激,因为现在我对于视频透明度的处理已经尽力而为了。

@BradLarson 我很想看到你对此的意见。 - Richard J. Ross III
嗨 Richard,你解决了问题吗?能发一下代码吗?谢谢 :D - Soch S.
没有;没修好;(我希望 @BradLarson 能来这里回答,但不幸的是这不是情况)。 - Richard J. Ross III
所以,我遇到了同样的问题,无法使其正常工作。但是在给Brad发送电子邮件后,我发现一个解决方法确实解决了视图不透明的问题。有关示例应用程序的源代码,请参见此博客文章:http://www.modejong.com/blog/post18_green_screen/index.html - MoDJ
2个回答

9

与原始问题类似,我想将一个绿幕视频放在自定义视图层次结构上,包括实时视频。结果发现使用标准的GPUImage ChromaKey滤镜无法实现。它不是利用alpha混合,而是将绿色像素与背景像素混合在一起。例如,红色背景变成了黄色,蓝色变成了青色。

使其正常工作需要两个步骤:

1)确保滤镜视图具有透明背景:

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);

现在视频中所有的关键像素(例如绿色)都变成透明的,并且揭示了滤镜视图下面的任何内容,包括(实时)视频。

1
这实际上与我最终所做的非常相似,但我的方法是改变了OpenGL层并编写了一个自定义过滤器。+1 - Richard J. Ross III
我也想做同样的事情,即在相机层上播放透明视频。你能告诉我你是怎么做到的吗?这个例子可以处理两个视频。但我想将其添加到相机层作为实时视频。 https://github.com/tuo/GPUImage/tree/master/examples/iOS/ChromaKeyVideoMerge - Kushal Panchal

1

我使用GPUImageChromaKeyBlendFilter并设置了一个背景图像,使其正常工作。但我想知道是否可以不设置背景。当我不设置背景时,电影显示为白色,但添加背景后就可以正常渲染...

filter = [[GPUImageChromaKeyBlendFilter alloc] init];
[(GPUImageChromaKeyBlendFilter *)filter setColorToReplaceRed:0.0 green:1.0 blue:0.0];
[(GPUImageChromaKeyBlendFilter *)filter setThresholdSensitivity:0.4];

UIImage *inputImage = [UIImage imageNamed:@"background.png"];
sourcePicture = [[GPUImagePicture alloc] initWithImage:inputImage smoothlyScaleOutput:YES];
[sourcePicture addTarget:filter];
[sourcePicture processImage];

background.png 是一张透明图片吗?还是它是父视图的图片? - Richard J. Ross III
我刚刚测试了一张透明的图片:http://imgur.com/jWaOW。那不会做我需要的事情,对于视频的背景来说,它**绝对**必须是透明的,不幸的是。 - Richard J. Ross III
其实它只是一张普通的图片,这是我使用的项目,对我很有效:http://ge.tt/29kBY5R - Soch S.
不幸的是,这并没有使GPUImageView透明,而这正是我所需要的。 - Richard J. Ross III
@user375584,透明图像实际上可以正常工作。但是您还需要将GPUImageView的背景设置为透明。 - Морт
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接