我想做两个具有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是否有帮助?)
谢谢。
发布于 2012-09-07 01:55:45
正如Hammer所指出的,我的开源GPUImage框架中的GPUImageDifferenceBlendFilter就是这样做的。它使用以下片段着色器来获取红色、绿色和蓝色通道的绝对差异:
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来执行此操作:
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 (或您的范围)。
https://stackoverflow.com/questions/12292637
复制相似问题