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

UnsafeMutablePointer<GLfloat>C から変換された型は、通常の配列と同様に、添え字を介して要素にアクセスできます。これらを 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 に答える