使用 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 秒,暂停或停止相机捕捉并处理您的结果。要获得平均红色,只需将红色通道总和除以在此期间测量的帧数即可。
我需要创建一种算法,基本上以每秒 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 秒,暂停或停止相机捕捉并处理您的结果。要获得平均红色,只需将红色通道总和除以在此期间测量的帧数即可。