1

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;
}

問題は、histogram.png が入力画像ごとに黒い線になることです。

では、iOS GPUImage を使用してヒストグラム UIImage を生成する正しいコードはどのようになりますか?

4

1 に答える 1

6

FilterShowcase の例を見ると、これが実際にどのように機能するかを確認できます。

GPUImageHistogramFilter は画像を取り込み、ヒストグラムをエンコードする 256x3 画像を出力します (フレームバッファーの構成では高さ 1 ピクセルが許可されていないため、高さは 3 ピクセルです)。R、G、および B の値は、そのイメージの中央にある高さ 1 ピクセルのストライプ内のそれぞれのカラー チャネルに格納されます。

これを視覚化するには、GPUImageHistogramGenerator を使用し、GPUImageHistogramFilter の出力をそれにフィードする必要があります。GPUImageHistogramGenerator は、ヒストグラム入力の視覚的表現を画像として作成します。-forceProcessingAtSize:デフォルトではサイズが設定されていないため、GPUImageHistogramGenerator の出力画像のサイズを設定するために使用する必要があります。

もう 1 つの注意点は、入力画像と 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];

これにより、生成されたヒストグラム ビジュアライゼーションが着信カメラ ビデオの上にオーバーレイされます。

于 2013-01-18T04:19:45.410 に答える