【发布时间】:2016-03-20 15:24:53
【问题描述】:
我正在尝试使用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 项目,但过滤器无法找到非常清晰的角落,就像在黑色背景上的一张纸上一样。
【问题讨论】:
-
由于无法找到清晰的角点,Harris角点检测器不是尺度不变的,因此图像分辨率越高,它会寻找的角点越清晰。
blurRadiusInPixels、sensitivity和threshold可以在给定的分辨率下进行调整,以拉出更多或更少的角落,但您也可以尝试降低进入检测器的图像的分辨率,让它们拾取更大的图像——缩放角。当前的实现也被限制为最多 256 个角,因此如果在图像的左上角检测到所有这些角,则不会报告更多。