6

我正在尝试使用 Brad Larson 的出色GPUImage框架,并且正在努力处理由GPUImageHarrisCornerDetectionFilter.

角作为一个数组返回GLFloat-UnsafeMutablePointer我想将它转换为一个数组CGPoint

我试过为内存分配空间

var cornerPointer = UnsafeMutablePointer<GLfloat>.alloc(Int(cornersDetected) * 2)

但数据似乎没有任何意义 - 无论是零还是 1E-32

我发现了如何在 Swift 中循环遍历 <UnsafeMutablePointer> 数组元素的完美答案并尝试了

filter.cornersDetectedBlock = {(cornerArray:UnsafeMutablePointer<GLfloat>, cornersDetected:UInt, frameTime:CMTime) in
        crosshairGenerator.renderCrosshairsFromArray(cornerArray, count:cornersDetected, frameTime:frameTime)

    for floatData in UnsafeBufferPointer(start: cornerArray, count: cornersDetected)
    {
        println("\(floatData)")
    }

但编译器不喜欢UnsafeBufferPointer- 所以我把它改成了UnsafeMutablePointer,但它不喜欢参数列表。

我确信这很好而且很简单,而且听起来像是其他人必须要做的事情 - 那么解决方案是什么?

4

3 回答 3

6

从 C 转换的UnsafeMutablePointer<GLfloat>类型可以通过下标访问其元素,就像普通数组一样。为了实现将这些转换为 CGPoints 的目标,我将使用以下代码:

filter.cornersDetectedBlock = { (cornerArray:UnsafeMutablePointer<GLfloat>, cornersDetected:UInt, frameTime:CMTime) in
    var points = [CGPoint]()
    for index in 0..<Int(cornersDetected) {
       points.append(CGPoint(x:CGFloat(cornerArray[index * 2]), y:CGFloat(cornerArray[(index * 2) + 1])))
    }
    // Do something with these points
}

内存支持cornerArray在触发回调之前立即分配,并在之后立即释放。除非你像我在上面所做的那样在块的中间复制这些值,否则我担心你会让自己面对一些讨厌的错误。无论如何,此时转换为正确的格式也更​​容易。

于 2016-02-10T20:17:55.663 回答
3

我找到了一个解决方案——而且很简单。答案在这里https://gist.github.com/kirsteins/6d6e96380db677169831

var dataArray = Array(UnsafeBufferPointer(start: cornerArray, count: Int(cornersDetected) * 2))
于 2016-02-10T17:55:39.857 回答
-1

尝试这个 :

     var cornerPointer = UnsafeMutablePointer<GLfloat>.alloc(Int(cornersDetected) * 2)

    filter.cornersDetectedBlock = {(cornerArray:UnsafeMutablePointer<GLfloat>, cornersDetected:UInt, frameTime:CMTime) in
        crosshairGenerator.renderCrosshairsFromArray(cornerArray, count:cornersDetected, frameTime:frameTime)

    for i in 0...cornersDetected
    {
        print("\(cornerPointer[i])")
    }
于 2016-02-10T10:37:40.193 回答