【问题标题】:Chroma-Filtering video using GPUImage?使用 GPUImage 对视频进行色度过滤?
【发布时间】:2012-09-17 15:48:39
【问题描述】:

我正在尝试使用@BradLarson 的超棒GPUImage 工具包使用透明度键(RGB: 0x00FF00,或全绿色)在我的应用程序中显示具有透明度的视频文件。但是,我在使用 GPUImageChromaKeyFilter 过滤器时遇到了一些问题,我不太明白为什么。

我的源视频文件在我的 Dropbox here 中可用(12 KB,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];

根据文档(这是稀疏的),这应该具有替换视频中所有绿色的效果。相反,我将其作为输出:

这告诉我视频正在播放(因此它正在复制到应用程序),但它似乎没有进行任何色度键控。为什么会这样?我是否需要手动设置平滑值和阈值?我不应该,因为源只包含两种颜色(0x00FF000x000000)。

我也在设备上对此进行了测试,但无济于事。我尝试使用的几乎所有其他过滤器都可以工作,例如GPUImageRGBFilterGPUImageSepiaFilter 等。GPUImageChromaKeyFilter 会被破坏吗?

对此的任何帮助将不胜感激,因为此时我正在刮擦桶的底部以获得视频的透明度。

【问题讨论】:

  • @BradLarson 我很想看到你对此的一些意见。
  • 嗨,理查德,你解决了这个问题吗?你会发布代码吗?谢谢:D
  • 不;没有解决;(我希望@BradLarson 可以进来回答自己,但可惜事实并非如此。
  • 所以,我遇到了同样的问题,但无法让它工作。但是在给 Brad 发送电子邮件后,我发现一种解决方法实际上确实解决了问题,只要视图不透明即可。此博客文章中提供了示例应用程序的源代码:modejong.com/blog/post18_green_screen/index.html

标签: ios video transparency gpuimage


【解决方案1】:

与最初的问题类似,我想在自定义视图层次结构之上放置一个绿屏视频,包括。直播视频。事实证明,使用标准 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);

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

【讨论】:

  • 这实际上与我最终所做的非常相似,但我最终更改了 OpenGL 层并编写了自定义过滤器。 +1
  • 我想做同样的事情。在相机层播放透明视频。你能告诉我你是怎么做到的吗?此示例适用于两个视频。但我想将它作为实时提要添加到相机层github.com/tuo/GPUImage/tree/master/examples/iOS/…
【解决方案2】:

我通过使用 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 是透明图像吗?还是superview的图片?
  • 我刚刚用透明图片测试过:imgur.com/jWaOW。这不能满足我的需要,不幸的是,它绝对对于视频的背景来说必须是透明的。
  • 实际上只是一张普通的图片,这是我使用的适合我的项目:ge.tt/29kBY5R
  • 不幸的是,这并没有使 GPUImageView 透明,这正是我所需要的。
  • 那我误解了最初的问题,对不起!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多