2016-03-20 8 views
20

Sto cercando di ottenere i punti d'angolo da un'immagine fissa utilizzando GPUImageHarrisCornerDetectionFilter.Come ottenere gli angoli utilizzando GPUImageHarrisCornerDetectionFilter

ho guardato il codice di esempio dal progetto, ho guardato la documentazione, e ho guardato questo post che è circa la stessa cosa: GPUImage Harris Corner Detection on an existing UIImage gives a black screen output

ma non riesco a farlo funzionare - e ho difficoltà a capire come questo dovrebbe funzionare con le immagini fisse.

Quello che ho a questo punto è questo:

func harrisCorners() -> [CGPoint] { 
    var points = [CGPoint]() 

    let stillImageSource: GPUImagePicture = GPUImagePicture(image: self.image) 
    let filter = GPUImageHarrisCornerDetectionFilter() 

    filter.cornersDetectedBlock = { (cornerArray:UnsafeMutablePointer<GLfloat>, cornersDetected:UInt, frameTime:CMTime) in 
     for index in 0..<Int(cornersDetected) { 
      points.append(CGPoint(x:CGFloat(cornerArray[index * 2]), y:CGFloat(cornerArray[(index * 2) + 1]))) 
     } 
    } 

    filter.forceProcessingAtSize(self.image.size) 
    stillImageSource.addTarget(filter) 
    stillImageSource.processImage() 

    return points 
} 

Questa funzione restituisce sempre [] quindi ovviamente non funziona.

Un dettaglio interessante: ho compilato il progetto FilterShowcaseSwift dagli esempi GPUImage e il filtro non riesce a trovare angoli molto chiari, come su un foglio di carta su uno sfondo nero.

+1

Per quanto riguarda la mancanza di angoli chiari, il rilevatore di angoli Harris non è invariante rispetto alla scala, quindi la risoluzione più alta dell'immagine, più angolato sarà l'angolo che cercherà. 'BlurRadiusInPixels',' sensitivity' e 'threshold' possono essere ottimizzati ad una data risoluzione per tirare fuori più o meno angoli, ma puoi anche sperimentare con l'abbassamento della risoluzione delle immagini che entrano nel rivelatore per farle raccogliere più grandi- angoli della scala. L'implementazione corrente è limitata ad un massimo di 256 angoli, quindi se tutti questi sono rilevati nella parte in alto a sinistra dell'immagine, non verranno più riportati. –

risposta

4
filter.cornersDetectedBlock = { (cornerArray:UnsafeMutablePointer<GLfloat>, cornersDetected:UInt, frameTime:CMTime) in 
    for index in 0..<Int(cornersDetected) { 
     points.append(CGPoint(x:CGFloat(cornerArray[index * 2]), y:CGFloat(cornerArray[(index * 2) + 1]))) 
    } 
} 

Questo codice qui impostato imposta un blocco che viene chiamato ogni fotogramma.

Questo è un processo asincrono in modo che quando la funzione restituisce che non è mai stato chiamato ancora e il tuo array deve essere sempre vuoto. Dovrebbe essere chiamato dopo che il frame ha terminato l'elaborazione.

Per verificare ciò, impostare un punto di interruzione all'interno di quel blocco e verificare se viene chiamato.

avvertimento da Brad Larson (creatore di GPUImage) nei commenti:

Il GPUImage si crea qui stillImageSource saranno deallocata dopo questa funzione uscite e potrebbe causare crash in questo caso.

+0

Sì, questo è vero. In realtà ho provato a stampare i punti dall'interno del ciclo for ad un certo punto, tuttavia il filtro non riesce a rilevare angoli nell'immagine di prova che stavo usando, quindi mi sono perso. – henrikstroem

+1

Tecnicamente, questo viene chiamato dopo ogni frame elaborato, indipendentemente dal fatto che siano stati rilevati angoli. Hai ragione che il metodo -processImage di GPUImagePicture attiva un processo di elaborazione su una coda di invio in background, che molto probabilmente non verrà completata prima dell'uscita di questa funzione. Ciò significa anche che la GPUImagePicture definita localmente in questa funzione sarà deallocata prima che l'elaborazione sia completata, il che può portare a crash se non stai attento. Una volta ho avuto una versione sincrona di questa operazione, ma non ricordo perché l'ho rimossa. Deadlock, forse? –

+0

Grazie per il passaggio con alcuni chiarimenti @BradLarson! Ho aggiornato con alcune informazioni che hai fornito. :] – Jack

Problemi correlati