【问题标题】:Creating an algorithm to find red intensity of the frames of a video using GPUImage使用 GPUImage 创建算法以查找视频帧的红色强度
【发布时间】:2016-12-30 17:03:20
【问题描述】:

我需要创建一个算法,该算法基本上以每秒 15 帧(总共 450 帧)从 iPhone 后置摄像头获取视频输入 30 秒。 30 秒时间结束后,不应再记录输入。最后,算法应该取 450 帧中每一帧的平均红色值或强度,留下 450 个红色值。显然,我正在使用 GPUImage 来完成所有这些工作。

现在,我有这样的事情:

GPUImageVideoCamera *videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack];
videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait;

GPUImageAverageColor *averageColor = [[GPUImageAverageColor alloc] init];
[averageColor setColorAverageProcessingFinishedBlock:^(CGFloat redComponent, CGFloat greenComponent, CGFloat blueComponent, CGFloat alphaComponent, CMTime frameTime)
// retrieve the average color values
 {
     NSLog(@"%f", redComponent); // print the red values
     // [redValues addObject:@(redComponent)]; <-- this is what I would use to put all of the red values in an array
 }];

[videoCamera addTarget:averageColor];
[videoCamera startCameraCapture];

我遇到的问题是我不知道在哪里设置我想要的视频每秒帧数(每秒 15 帧),我也不确定在哪里指定我想要我的视频多长时间样本为(30 秒)。我最大的问题是控制台根本没有打印任何红色值,即使相机应该捕获视频。

如何解决所有这三个问题?示例代码将不胜感激。

【问题讨论】:

  • GitHub reposotory 中的介绍性文档告诉您一般如何使用过滤器,以及您特别感兴趣的过滤器(给它一个块以接收平均值);并且还提供了生成 API 文档的说明。如果您已阅读此文章,请编辑您的问题,以展示您尝试过的内容以及无效的内容/您不理解的内容。
  • 我刚刚浏览了 GPUImage 文档。看起来直播视频的管道已经为您完成,因此您可以跳过那里的分解步骤。接受@CRD 的建议,从文档中描述的简单内容开始。关键是,复杂的事情不会完整地诞生。他们成长为更简单(经过测试)的部分。
  • @CRD 现在正在尝试。
  • @CRD 我找到了我必须使用here 的块,但我仍然不确定如何实现过滤器,因为介绍性文档不是很具体。
  • @CRD 已编辑,添加了更多详细信息。

标签: objective-c gpuimage


【解决方案1】:

您上面的设置是正确的,其余的只是需要在回调块中实现的逻辑。该块将每帧触发一次,传入 RGBA 组件值(作为 0.0-1.0 浮点数)。

如果您想让它平均红色通道值,请设置一个 sum 实例变量(初始化为 0.0)并将每个新的红色值添加到其中。您还需要设置一个计数器实例变量,每次激活块时递增一次。

要让这个运行 30 秒,并且不再运行,请在上面调用 -startCameraCapture 之前获取时间戳,并将其与每次调用块时的当前时间戳进行比较。一旦超过 30 秒,暂停或停止相机捕捉并处理您的结果。要获得平均红色,只需将红色通道总和除以在此期间测量的帧数即可。

【讨论】:

  • 如果我执行您建议的红色平均功能,我不会只剩下所有帧组合的单个红色平均值吗?我试图找到 each 帧的平均红色值;使用你的框架可以吗?
  • 我这样问是因为 GPUImage 的文档强烈建议可以为视频中的每一帧获取平均红色值,而不是单个总平均红色值。另外,最后一件事,每个 RGBA 分量值的 R 分量值是每帧的平均红色值吗?
  • @fi12 - 哦,我看错了你的第三句话。在这种情况下,不要维护一个运行计数,只需获取每个值(这是该帧的平均值)并将其存储在一个数组中。我应该注意,相机并不总是以保证的帧速率更新(取决于照明条件),因此您最终可能会在 30 秒内获得比预期更多或更少的帧。
  • 感谢您迄今为止的所有帮助。我还有一件事要问:此链接的 RGBA 部分指出 0 和 1 之间的浮点数是不透明度值,而不是平均红色值(与您所说的相反。)在上面链接中提供的示例中,红色值显示在 0 到 255 之间,而不透明度在 0 到 1 之间。因此,我期望红色值在 0 到 255 之间。有没有办法将浮点值转换为 rgb 整数之间0 和 255?
  • @fi12 - 每个组件都单独输入到该块中,每个组件都作为 0.0 - 1.0 的 CGFloat 提供。 redComponent 是平均红色值,alphaComponent 是平均不透明度等。您在已删除评论中提供的链接与上述无关,所以不要担心。要转换为 0 - 255 范围,只需将传入值乘以 256(我认为,因为它应该以 0.996 为基数,但我可能错了,您可能需要乘以 255)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-24
相关资源
最近更新 更多