2013-07-29 16 views
8

Próbuję użyć GPUImagePoissonBlendFilter struktury GPUImage do mieszania dwóch twarzy w mojej mieszanie twarzy. Oto mój kod.Mieszanie za pomocą GPUImagePoissonBlendFilter

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

Jak widać, daję dwa obrazy (rearFace i frontFace) jako wejścia do tej metody. Przednia powierzchnia obrazu jest kształtem (kształtem wielokąta utworzonym przez połączenie względnej pozycji oczka i ust) i ma taki sam rozmiar jak obraz tylnej płaszczyzny, np. (W celu dopasowania do rozmiaru, wypełniłem przestrzeń zewnętrzną do kształtu wielokątnego z przezroczystym kolorem podczas rysowania).

Jednak mieszanie nie następuje tak, jak się spodziewałem. tj. ostre krawędzie przedniej powierzchni nie są odpowiednio mieszane z tylną powierzchnią. Tutaj zakładam, że PoissonBlendFilter rozpoczyna mieszanie drugiego obrazu z jego lewego górnego rogu zamiast górnej lewej krawędzi twarzy.

Problem: Czuję, że obraz wejściowy nie jest prawidłowo podawany do filtra. Czy muszę zastosować jakiś rodzaj maskowania do obrazu wejściowego? Czy ktoś może mnie w tym poprowadzić?

Odpowiedz

0

GPUImage może czasami okazać się trudny w przypadku filtrów z dwoma wejściami. Podczas dodawania filtru mieszania do pierwszego obrazu źródłowego należy jawnie określić położenie tekstury. Więc zamiast:

[picture1 addTarget:poissonFilter];

Spróbuj tego:

[picture1 addTarget:poissonFilter atTextureLocation:0];

Reszta (picture1 lub jakiekolwiek inne) nie potrzebują tego, ale jest tam mały błąd z dwóch filtrów wejściowych czasami wymagają nieokreślonego określenia położenia tekstury.