如何使用iOS GPUImage生成直方图?

Lui*_*oza 1 iphone objective-c ios gpuimage

https://github.com/luisespinoza/LEColorPicker项目上工作,我试图使用项目GPUImage(https://github.com/BradLarson/GPUImage)从任意输入UIImage生成直方图UIImage.

我正在使用的当前代码如下:

- (NSDictionary*)dictionaryWithColorsPickedFromImage:(UIImage *)image
{
    GPUImageFilter *filter = [[GPUImageHistogramFilter alloc] initWithHistogramType:kGPUImageHistogramRGB];

    UIImage *filteredImage = [filter imageByFilteringImage:image];

    [UIImagePNGRepresentation(filteredImage) writeToFile:@"/Users/Luis/histogram.png" atomically:YES];

    return nil;
}
Run Code Online (Sandbox Code Playgroud)

问题是histogram.png只为每个输入图像产生一条黑线.

那么,如何使用iOS GPUImage生成直方图UIImage的正确代码呢?

Bra*_*son 6

您可以查看FilterShowcase示例,了解它在实践中应该如何工作.

GPUImageHistogramFilter接收图像并输出256x3图像,该图像对直方图进行编码(它的高度为3像素,因为帧缓冲构造中不允许1像素高度).R,G和B值存储在它们各自的颜色通道中,位于该图像中心的中心1像素高的条带内.

要想象这一点,您需要使用GPUImageHistogramGenerator,并将GPUImageHistogramFilter的输出提供给它.GPUImageHistogramGenerator将直方图输入的可视化表示创建为图像.您需要使用-forceProcessingAtSize:设置GPUImageHistogramGenerator的输出图像的大小,因为默认情况下它没有设置大小.

另一个警告是,您需要在输入图像和GPUImageHistogramFilter之间使用某种虚拟过滤器.GPUImageHistogramFilter目前依赖于glReadPixels()并且仅适用于渲染内容,而不适用于直接上传的图像或视频帧.

FilterShowcase中使用的代码如下:

        filter = [[GPUImageHistogramFilter alloc] initWithHistogramType:kGPUImageHistogramRGB];

        GPUImageGammaFilter *gammaFilter = [[GPUImageGammaFilter alloc] init];
        [videoCamera addTarget:gammaFilter];
        [gammaFilter addTarget:filter];

        GPUImageHistogramGenerator *histogramGraph = [[GPUImageHistogramGenerator alloc] init];

        [histogramGraph forceProcessingAtSize:CGSizeMake(256.0, 330.0)];
        [filter addTarget:histogramGraph];

        GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init];
        blendFilter.mix = 0.75;            
        [blendFilter forceProcessingAtSize:CGSizeMake(256.0, 330.0)];

        [videoCamera addTarget:blendFilter];
        [histogramGraph addTarget:blendFilter];

        [blendFilter addTarget:filterView];
Run Code Online (Sandbox Code Playgroud)

这将生成的直方图可视化叠加在传入的摄像机视频之上.