Comment get des coins en utilisant GPUImageHarrisCornerDetectionFilter

J'essaie d'get les points de coin d'une image fixe en utilisant GPUImageHarrisCornerDetectionFilter .

J'ai regardé l'exemple de code du projet, j'ai regardé la documentation, et j'ai regardé ce post qui est à peu près la même chose: GPUImage Harris Corner Detection sur un UIImage existant donne une sortie écran noir

Mais je ne peux pas le faire fonctionner – et j'ai du mal à comprendre comment cela est censé fonctionner avec des images fixes.

Ce que j'ai à ce stade est la suivante:

 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 } 

Cette fonction renvoie toujours [] pour que cela ne fonctionne évidemment pas.

Un détail intéressant – J'ai compilé le projet FilterShowcaseSwift à partir d'exemples de GPUImage, et le filter ne parvient pas à find des coins très clairs, comme sur une feuille de papier sur un fond noir.

 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]))) } } 

Ce code que vous avez ici définit un bloc qui est appelé chaque image.

C'est un process asynchronous donc quand votre fonction returnne qui n'a jamais été appelée encore et votre tableau devrait toujours être vide. Il devrait être appelé après le traitement du cadre.

Pour vérifier cela, définissez un point d'arrêt à l'intérieur de ce bloc et voyez s'il est appelé.

Avertissement de Brad Larson (créateur de GPUImage) dans les commentaires:

La GPUImage que vous créez ici stillImageSource sera désallouée après l' stillImageSource de cette fonction et peut provoquer des plantages dans ce cas.