ios - 如何使用 GPUImageHarrisCornerDetectionFilter 获取角点

标签 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 项目,过滤器无法找到非常清晰的角落,就像在黑色背景上的一张纸上一样。

最佳答案

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])))
    }
}

您在此处的这段代码设置了一个在每一帧都被调用的 block 。

这是一个异步过程,因此当您的函数返回时从未被调用过并且您的数组应该始终为空。它应该在框架完成处理后调用。

要验证这一点,请在该 block 内设置一个断点并查看它是否被调用。

Brad Larson(GPUImage 的创建者)在评论中的警告:

您在此处创建的 GPUImage stillImageSource 将在此函数退出后被释放,在这种情况下可能会导致崩溃。

关于ios - 如何使用 GPUImageHarrisCornerDetectionFilter 获取角点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36115650/

相关文章:

ios - block 不被调用

swift - 可以使用相同的方法多次扩展 Swift 类吗?

ios - CGRectMake 返回零?

ios - 即使在解除分配后,GPUImageFilters 中的某些内容仍保留在内存中

ios - 排序数组中的 sortedArrayUsingComparator 包含具有 2 个数字的对象

ios - 更改 MBProgressHUD Loader 的位置

ios - NSDate 是否更改了它的描述输出?

swift - Swift 中的日期/时间自然语言近似

arrays - JSON 数组不会快速显示在 UITable 中

ios - 链式过滤导致内存崩溃