3

@BradLarson の素晴らしいGPUImageRGB: 0x00FF00ツールキットを使用して、透明キー (または完全な緑色) を使用して、アプリケーション内で透明なビデオ ファイルを表示しようとしています。ただし、フィルターでいくつかの問題が発生しており、その理由がよくわかりません。GPUImageChromaKeyFilter

私のソース ビデオ ファイルは、こちらのドロップボックスにあります(12 KB、長さ 3 秒、完全な緑色の背景、画面上の正方形のみ)。

というタイトルのサンプル プロジェクトを使用しましたSimpleVideoFilter

これは私が使用しようとしたコードです(単に置き換えました-viewDidLoad):

NSURL *sampleURL = [[NSBundle mainBundle] URLForResource:@"sample" withExtension:@"m4v"];
movieFile = [[GPUImageMovie alloc] initWithURL:sampleURL];

filter = [[GPUImageChromaKeyFilter alloc] init];
[filter setColorToReplaceRed:0 green:1 blue:0];
[filter setEnabled:YES];

[movieFile addTarget:filter];

GPUImageView *filterView = (GPUImageView *)self.view;
[filter addTarget:filterView];

[movieFile startProcessing];

ドキュメント (まばらです) によると、これはビデオのすべての緑を置き換える効果があるはずです。代わりに、これを出力として取得します。

ビデオのスクリーンショット

これは、ビデオが再生されている (つまり、アプリケーションにコピーされている) ことを示していますが、クロマ キー処理は行われていないようです。これはなぜでしょうか?スムージング値としきい値を手動で設定する必要がありますか? ソースには 2 つの色 (0x00FF000x000000) しか含まれていないため、そうすべきではありません。

デバイスでもこれをテストしましたが、役に立ちませんでした。GPUImageRGBFilter、 など、使用しようとしている他のほとんどすべてのフィルターが機能しますGPUImageSepiaFilterGPUImageChromaKeyFilter単に壊れている可能性がありますか?

この時点で、ビデオの透明性のためにバレルの底をこすっているので、これに関する助けをいただければ幸いです。

4

2 に答える 2

9

元の質問と同様に、カスタム ビュー階層を含むグリーン スクリーン ビデオを配置したいと考えていました。ライブビデオ。これは、標準の GPUImage ChromaKey フィルターでは不可能であることが判明しました。アルファブレンディングの代わりに、緑のピクセルを背景のピクセルとブレンドしました。たとえば、赤い背景は黄色になり、青はシアンになりました。

機能させるには、次の 2 つの手順が必要です。

1) filterview の背景が透明であることを確認します。

filterView.backgroundColor=[UIColor clearColor];

2) GPUImageChromaKeyFilter.m を変更します。

old: gl_FragColor = vec4(textureColor.rgb, textureColor.a * blendValue);
new: gl_FragColor = vec4(textureColor.rgb * blendValue, 1.0 * blendValue);

これで、ビデオ内のすべてのキー付き (たとえば緑) ピクセルが透明になり、フィルタービューの下にあるものを明らかにします。(ライブ)ビデオ。

于 2013-04-23T12:30:11.607 に答える
1

GPUImageChromaKeyBlendFilterを使用して背景画像を設定することで動作するようになりました。背景を設定しなくてもできるかどうか知りたいのですが。背景を設定しないと、ムービーは白く表示されますが、背景を追加すると正常にレンダリングされます...

filter = [[GPUImageChromaKeyBlendFilter alloc] init];
[(GPUImageChromaKeyBlendFilter *)filter setColorToReplaceRed:0.0 green:1.0 blue:0.0];
[(GPUImageChromaKeyBlendFilter *)filter setThresholdSensitivity:0.4];

UIImage *inputImage = [UIImage imageNamed:@"background.png"];
sourcePicture = [[GPUImagePicture alloc] initWithImage:inputImage smoothlyScaleOutput:YES];
[sourcePicture addTarget:filter];
[sourcePicture processImage];
于 2012-11-06T19:17:27.200 に答える