2013-07-29 27 views
8

Sto cercando di utilizzare GPUImagePoissonBlendFilter del framework GPUImage per unire due facce nella mia applicazione di fusione del viso. Ecco il mio codice.Fusione utilizzando 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]; 
    } 

cioè Come potete vedere, sto dando due immagini (rearFace e FrontFace) come input per questo metodo. La faccia anteriore dell'immagine è una forma (forma poligonale formata dall'unione delle relative posizioni dell'occhio e della bocca) ed è della stessa dimensione dell'immagine del reticolo posteriore i .e (Per abbinare la dimensione, ho riempito lo spazio esterno alla forma poligonale con colore trasparente mentre si disegna).

Tuttavia la miscelazione non si verifica come mi aspettavo. vale a dire che i bordi affilati della faccia anteriore non sono miscelati correttamente nella parte posteriore. Qui la mia ipotesi è che il PoissonBlendFilter inizi a fondere la seconda immagine dal suo angolo in alto a sinistra piuttosto che dal bordo in alto a sinistra della faccia.

Problema: Sento che l'immagine di ingresso non è stata inserita correttamente nel filtro. Devo applicare un qualche tipo di mascheramento all'immagine di input? Qualcuno può guidarmi in questo?

risposta

0

GPU L'immagine può a volte diventare complicata con i filtri a due ingressi. Quando aggiungi il filtro di fusione alla prima immagine di origine, specifica esplicitamente il percorso della trama. Così, invece di:

[picture1 addTarget:poissonFilter];

Prova questo:

[picture1 addTarget:poissonFilter atTextureLocation:0];

Il resto (picture1 o qualsiasi altri) non hanno bisogno di questo, ma c'è un piccolo bug con due filtri di ingresso che a volte è necessario specificare in modo esplicito la posizione della trama.