8

GPUImage フレームワークの GPUImagePoissonBlendFilter を使用して、顔ブレンディング アプリケーションで 2 つの顔をブレンドしようとしています。これが私のコードです。

- (void)applyPoissonBlendToImage:(UIImage *) rearFace withImage:(UIImage *) frontFace 
{  
       GPUImagePicture* picture1 = [[GPUImagePicture alloc] initWithImage:rearFace];
       GPUImagePicture* picture2 = [[GPUImagePicture alloc] initWithImage:frontFace];

       GPUImagePoissonBlendFilter * poissonFilter = [[GPUImagePoissonBlendFilter alloc] init];
       poissonFilter.mix = .7;
       poissonFilter.numIterations = 200;

       [picture1 addTarget:poissonFilter];
       [picture1 processImage];

       [picture2 addTarget:poissonFilter];
       [picture2 processImage];

      finalResultImage = [poissonFilter imageFromCurrentlyProcessedOutputWithOrientation:rearFace.imageOrientation];
   }

つまり、ご覧のとおり、このメソッドへの入力として 2 つの画像 (rearFace と frontFace) を指定しています。画像の前面は形状 (相対的な目と口の位置を結合することによって形成される多角形) であり、rearFace 画像と同じサイズです (サイズを合わせるために、多角形の外側のスペースを塗りつぶしました)。描画中に透明色で)。

しかし、私が期待したようにブレンドは起こりません。つまり、前面の鋭いエッジが背面に適切にブレンドされていません。ここで、PoissonBlendFilter は、顔の左上の境界ではなく、左上隅から 2 番目の画像のブレンドを開始すると仮定しています。

問題:入力画像が正しくフィルターに入力されていないように感じます。入力画像にある種のマスキングを適用する必要がありますか? 誰でもこれで私を案内できますか?

4

1 に答える 1

0

GPUImage は、2 入力フィルターを使用すると扱いにくくなることがあります。最初のソース イメージにブレンド フィルターを追加するときは、テクスチャの場所を明示的に指定します。したがって、代わりに:

[picture1 addTarget:poissonFilter];

これを試して:

[picture1 addTarget:poissonFilter atTextureLocation:0];

残り (picture1またはその他) はこれを必要としませんが、テクスチャの場所を明示的に指定する必要がある場合がある 2 つの入力フィルターに小さなバグがあります。

于 2013-08-31T08:35:41.170 に答える