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

Creating an algorithm to find red intensity of the frames of a video using 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 秒)。我最大的问题是控制台根本不打印任何红色值,即使相机应该捕捉视频也是如此。

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

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

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

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