我正在尝试使用GPUImageHarrisCornerDetectionFilter
从静止图像中获取角点。
我查看了项目中的示例代码,我查看了文档,我看过这篇文章是关于同样的事情: GPUImage Harris Corner Detection on an existing UIImage gives a black screen output
但是我无法让它发挥作用 - 我很难理解这应该如何与静止图像一起使用。
我现在所拥有的是:
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
}
此函数始终返回[]
,因此它显然无效。
一个有趣的细节 - 我从GPUImage示例中编译了FilterShowcaseSwift项目,并且过滤器无法找到非常清晰的角落,就像在黑色背景上的一张纸上一样。
答案 0 :(得分: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])))
}
}
这里的代码设置了一个每帧调用的块。
这是一个异步过程,所以当你的函数返回时从未调用过,而你的数组应该总是为空。它应该在帧完成处理后调用。
要验证这一点,请在该块内设置一个断点,看看它是否被调用。
评论中Brad Larson(GPUImage的创建者)的警告:
此函数退出后,您在此处创建的GPUImage将被释放,在这种情况下可能会导致崩溃。