使用GPUImage创建算法以查找视频帧的红色强度

时间:2016-12-30 17:03:21

标签: objective-c gpuimage

我需要创建一种算法,该算法基本上以每秒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秒)。我最大的问题是控制台根本不打印任何红色值,即使相机应该捕捉视频。

如何解决所有这三个问题?示例代码将受到高度赞赏。

1 个答案:

答案 0 :(得分:1)

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

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

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