如何使用GPUImageHarrisCornerDetectionFilter

时间:2016-03-20 15:24:54

标签: ios swift2 gpuimage

我正在尝试使用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项目,并且过滤器无法找到非常清晰的角落,就像在黑色背景上的一张纸上一样。

1 个答案:

答案 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将被释放,在这种情况下可能会导致崩溃。