如何使用 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 将在该函数退出后被释放,在这种情况下可能会导致崩溃。