首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS:如何使用GPU能力减去两个视频帧?

iOS:如何使用GPU能力减去两个视频帧?
EN

Stack Overflow用户
提问于 2012-09-06 11:38:17
回答 1查看 1.3K关注 0票数 1

我想做两个具有GPU处理能力的RGB视频帧减法。即,第一图像的每个像素的R、G、B值与第二图像相减。此外,结果需要具有负的RGB值并存储在NSMutableArray中。我使用AVCaptureSession来帮助我获得CMSampleBufferRef格式的原始视频帧。

1)是否有支持负RGB值的图片格式?或者我需要创建一个类似矩阵的类来存储图像?

(似乎某些图像格式使用浮点数来存储RGB值...)

(我听说过图像不同的混合模式,它类似于我想要的,但将绝对的RGB值,我希望结果是负值)

2) GPU处理能力如何做减法?

(我可以使用CPU,但FPS太慢,大约为5-6 FPS,但我希望它是30 FPS)

( OpenGL或Quartz Composer是否有帮助?)

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-07 01:55:45

正如Hammer所指出的,我的开源GPUImage框架中的GPUImageDifferenceBlendFilter就是这样做的。它使用以下片段着色器来获取红色、绿色和蓝色通道的绝对差异:

代码语言:javascript
复制
 varying highp vec2 textureCoordinate;
 varying highp vec2 textureCoordinate2;

 uniform sampler2D inputImageTexture;
 uniform sampler2D inputImageTexture2;

 void main()
 {
     mediump vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);
     mediump vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2);
     gl_FragColor = vec4(abs(textureColor2.rgb - textureColor.rgb), textureColor.a);
 }

如果您需要比较连续的视频帧,您还可以使用GPUImageBuffer来延迟要与当前视频帧一起处理的较旧帧。我在框架内的FilterShowcase示例应用程序中有一个这样的示例。

我不太确定您所说的“结果希望具有负的RGB值”是什么意思。当前iOS设备上支持纹理支持的帧缓冲区(渲染目标)的唯一纹理格式是32位BGRA。这意味着每个颜色通道的范围从0到255,不允许有负值。不过,您可以将该颜色范围的下半部分用于负值,将上半部分用于正值。

您可以使用如下所示的片段着色器修改我的GPUImageSubtractBlendFilter来执行此操作:

代码语言:javascript
复制
 varying highp vec2 textureCoordinate;
 varying highp vec2 textureCoordinate2;

 uniform sampler2D inputImageTexture;
 uniform sampler2D inputImageTexture2;

 void main()
 {
     lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);
     lowp vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2);

     gl_FragColor = vec4((textureColor.rgb - textureColor2.rgb + 1.0) * 0.5, textureColor.a);
 }

然后,在读出像素后,您需要将0-255输出转换为-128 - 128 (或您的范围)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12292637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档