如何使用 GPUImageHarrisCornerDetectionFilter 获取角点
How to get corners using GPUImageHarrisCornerDetectionFilter
我正在尝试使用 GPUImageHarrisCornerDetectionFilter
从静止图像中获取角点。
我查看了项目中的示例代码,查看了文档,还查看了大致相同的 post:
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
}
这个函数总是returns []
所以它显然不起作用。
一个有趣的细节 - 我从 GPUImage 示例编译了 FilterShowcaseSwift 项目,过滤器无法找到非常清晰的角落,就像在黑色背景上的 sheet 纸上一样。
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])))
}
}
您在此处的这段代码设置了一个块,每帧都会调用它。
这是一个异步过程,因此当您的函数 returns 从未被调用并且您的数组 应该 始终为空时。应该在框架完成处理后调用。
要验证这一点,请在该块内设置一个断点并查看它是否被调用。
Brad Larson(GPUImage 的创建者)在评论中的警告:
您在此处创建的 GPUImage stillImageSource
将在该函数退出后被释放,在这种情况下可能会导致崩溃。
我正在尝试使用 GPUImageHarrisCornerDetectionFilter
从静止图像中获取角点。
我查看了项目中的示例代码,查看了文档,还查看了大致相同的 post: 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
}
这个函数总是returns []
所以它显然不起作用。
一个有趣的细节 - 我从 GPUImage 示例编译了 FilterShowcaseSwift 项目,过滤器无法找到非常清晰的角落,就像在黑色背景上的 sheet 纸上一样。
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])))
}
}
您在此处的这段代码设置了一个块,每帧都会调用它。
这是一个异步过程,因此当您的函数 returns 从未被调用并且您的数组 应该 始终为空时。应该在框架完成处理后调用。
要验证这一点,请在该块内设置一个断点并查看它是否被调用。
Brad Larson(GPUImage 的创建者)在评论中的警告:
您在此处创建的 GPUImage stillImageSource
将在该函数退出后被释放,在这种情况下可能会导致崩溃。