2016-10-08 4 views
0

私は、Accelerateフレームワークを使用してCGImageに行列を適用します。Swift 3でvImageMatrixMultiplyを使用するには?

まず、私はvImageMatrixMultiplyを適用しようとした後、

、vImage_Bufferに

let bitmapInfo: CGBitmapInfo = [ .floatComponents, 
           CGBitmapInfo(rawValue: CGImageAlphaInfo.none.rawValue), 
           .byteOrder32Little ] 

var format = vImage_CGImageFormat(bitsPerComponent: 32, 
            bitsPerPixel: 32 * 3, 
            colorSpace: nil, 
            bitmapInfo: FloatBitmapInfo, 
            version: 0, 
            decode: nil, 
            renderingIntent: .defaultIntent) 

var inputBuffer = vImage_Buffer() 

vImageBuffer_InitWithCGImage(&inputBuffer, 
           &format, 
           nil, 
           aCGImage,    // input CGImage 
           UInt32(kvImageNoFlags)) 
をCGImageを変換します。

vImageMatrixMultiply_PlanarF(&inputBuffer,   // srcs 
           &outputBuffer,  // dests 
           3,     // src_planes 
           3,     // dest_planes 
           aMatrix,    // applying matrix 
           &preBias,    // pre_bias 
           &postBias,   // post_bias 
           UInt32(kvImageNoFlags)) 

しかしvImageMatrixMultiplyはSRCSとしてvImage_Bufferを受け入れ、引数をdests、そして私が記述したコンパイルエラー持っていないん

が期待される引数の型「UnsafePointer < vImage_Bufferに型の値「vImage_Buffer」を変換できません。 >? "

"vImage_Buffer"を "UnsafePointer < vImage_Buffer>に変換しましたか?"答えは見つかりませんでした。

は、だから私は "?> UnsafePointer < vImage_Buffer" "vImage_Buffer" に変換する方法を知りたい、または直接作成する方法 "> UnsafePointer < vImage_Bufferの?" CGImageから、またはvImageMatrixMultiplyを適切に使用するその他の方法

答えて

0

IはvImageMatrixMultiply_PlanarFを使用していないが、ヘッダドキュメント及び機能シグネチャによれば、あなたは、最初の2つのパラメータ、srcsdestsための複数vImage_Buffer Sへのポインタを渡す必要があります。

複数の値をUnsafeMutablePointer<T>に渡す必要がある場合、通常は変数[T]を宣言し、inout引数として渡します。

T = UnsafePointer<vImage_Buffer>?の場合、[UnsafePointer<vImage_Buffer>?]という変数を宣言する必要があります。 そして、配列に含まれる各ポインタは、適切に準備されたvImage_Bufferを指す必要があります。この回答の古いコードは悪い方法でwith...メソッドを使用していた UPDATED

。更新されたコードを試してください。


したがって、あなたはこのような何か書く必要がある場合があります。

//Prepare 3 vImage_Buffers for source planes 
    //(vImageConvert_RGBFFFtoPlanarF) 
    //You are responsible for filling out the height, width, and rowBytes fields of this structure, and for allocating a data buffer of the appropriate size. 
    let inputBuffers: [vImage_Buffer] = (0...2).map {_ in 
     var imageBuf = vImage_Buffer() 
     imageBuf.width = inputBuffer.width 
     imageBuf.height = inputBuffer.height 
     imageBuf.rowBytes = Int(imageBuf.width) * MemoryLayout<Float>.size 
     imageBuf.data = malloc(imageBuf.rowBytes * Int(imageBuf.height)) 
     return imageBuf 
    } 

    //Prepare 3 vImage_Buffers for destination planes 
    //(vImageMatrixMultiply_PlanarF) 
    //You are responsible for filling out the height, width, and rowBytes fields of these structures, and for allocating data buffers of the appropriate size. 
    let outputBuffers: [vImage_Buffer] = (0...2).map {_ in 
     var imageBuf = vImage_Buffer() 
     imageBuf.width = inputBuffer.width 
     imageBuf.height = inputBuffer.height 
     imageBuf.rowBytes = Int(imageBuf.width) * MemoryLayout<Float>.size 
     imageBuf.data = malloc(imageBuf.rowBytes * Int(imageBuf.height)) 
     return imageBuf 
    } 

    //`aMatrix` needs to hold `src_planes`x`dest_planes` elements 
    let aMatrix: [Float] = [0.5, 0.25, 0.25, 0.25, 0.5, 0.25, 0.25, 0.25, 0.5] 
    var preBias: Float = 0.0 
    var postBias: Float = 0.0 
    //You need to use pointers or BufferPointers inside the closure, should not take them out of the closure 
    inputBuffers.withUnsafeBufferPointer {inputBuffersBP in 
     outputBuffers.withUnsafeBufferPointer {outputBuffersBP in 
      //Prepare pointer array pointing each vImage_Buffer 
      var inputBufferPointers: [UnsafePointer<vImage_Buffer>?] = 
       inputBuffers.withUnsafeBufferPointer {inputBuffersBP in 
        (0...2).map{inputBuffersBP.baseAddress! + $0} 
      } 
      //If you want to use PlanarF format, you need to split RGB into distict vImage_Buffers 
      vImageConvert_RGBFFFtoPlanarF(
       &inputBuffer, 
       inputBufferPointers[0]!, 
       inputBufferPointers[1]!, 
       inputBufferPointers[2]!, 
       UInt32(kvImageNoFlags) 
      ) 
      //Prepare pointer array pointing each vImage_Buffer 
      var outputBufferPointers: [UnsafePointer<vImage_Buffer>?] = 
       outputBuffers.withUnsafeBufferPointer {outputBuffersBP in 
        (0...2).map{outputBuffersBP.baseAddress! + $0} 
      } 
      //All these things prepared properly, you can call `vImageMatrixMultiply_PlanarF` like this... 
      vImageMatrixMultiply_PlanarF(
       &inputBufferPointers,   // srcs 
       &outputBufferPointers,  // dests 
       3,     // src_planes 
       3,     // dest_planes 
       aMatrix,    // applying matrix 
       &preBias,    // pre_bias 
       &postBias,   // post_bias 
       UInt32(kvImageNoFlags) 
      ) 
     } 
    } 
+0

をコードするためにありがとうございました。それは私が思っていたよりもはるかに複雑です... – rdeepy

+0

実際には、私はAccelerateフレームワークの非常に小さな部分を使っていますが、これは私が経験した他のものよりも難しいです。上記のコードの一部を実際に採用している場合は、教えてください。あなたはそれを使用した後にいくつかの仕上げコードが必要です... – OOPer

+0

ありがとうございます。私はvDSPを使いましたが、私がvImageを使うのは初めてです。私はCore Imageをチェックし始めました.CIColorMatrixが私の要求をより簡単に満たすと思っています。 – rdeepy

関連する問題