我需要创建一种算法,该算法基本上以每秒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秒)。我最大的问题是控制台根本不打印任何红色值,即使相机应该捕捉视频。
如何解决所有这三个问题?示例代码将受到高度赞赏。
答案 0 :(得分:1)
上面的设置是正确的,其余部分只是需要在回调块中实现的逻辑。该帧将在每帧触发一次,传入RGBA组件值(为0.0-1.0浮点数)。
如果要平均红色通道值,请设置一个sum实例变量(初始化为0.0)并为其添加每个新的红色值。您还需要设置一个计数器实例变量,每个块激活时增加一次。
要使此运行30秒(不再运行),请在上面调用-startCameraCapture
之前取一个时间戳,并在每次调用块时将其与当前时间戳进行比较。一旦超过30秒,暂停或停止摄像头捕获并处理结果。要获得平均红色,只需将红色通道总和除以此期间测量的帧数即可。