Исключение при использовании MPSImageConvolution - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь использовать MPSImageConvolution для некоторой фильтрации изображений и постоянно получаю сообщение об ошибке: «отсутствует привязка буфера по индексу 1 для wt [0]».Когда используется тот же код с MPSImageLaplacian, он работает нормально.

Это мой код:

    let img = UIImage(named: "some-image")!
    // convert to single channel grayscale and scale to half-size
    let image = toGrayscale(cgImage: img.cgImage!, scale: 2)

    let cmdQ: MTLCommandQueue! = device.makeCommandQueue()
    let commandBuffer = cmdQ.makeCommandBuffer()!

    let textureLoader = MTKTextureLoader(device: device)
    let options: [MTKTextureLoader.Option : Any]? = nil // [ MTKTextureLoader.Option.SRGB : NSNumber(value: false) ]
    let srcTex = try! textureLoader.newTexture(cgImage: image.cgImage!, options: options)

    let lapKernel: [Float] =
    [
        0.0, 1.0, 0.0,
        1.0, -4.0, 1.0,
        0.0, 1.0, 0.0
    ];

    let unsafeArray: UnsafePointer<Float> = UnsafePointer<Float>(lapKernel)

    let desc = MTLTextureDescriptor.texture2DDescriptor(pixelFormat: srcTex.pixelFormat,
                                                              width: srcTex.width,
                                                              height: srcTex.height,
                                                              mipmapped: false)
    desc.usage.formUnion(.shaderWrite)
    let lapTex = device.makeTexture(descriptor: desc)

    //  let lapConv = MPSImageLaplacian(device: device) <-- Using this works fine
    let lapConv = MPSImageConvolution(device: device, kernelWidth: 3, kernelHeight: 3, weights: unsafeArray)
    lapConv.encode(commandBuffer: commandBuffer, sourceTexture: srcTex, destinationTexture: lapTex!)

Последняя строка фрагмента кода выше вылетает со следующей ошибкой:

validateComputeFunctionArguments: 811: сбой утверждения `Функция вычисления (k_1x3_R_1x_5y_f): отсутствует привязка буфера к индексу 1 для wt [0]. '

Есть идеи, в чем может быть проблема?кроме того, я также использую медианный фильтр и пороговый фильтр, и все прекрасно работает ... Thx!

1 Ответ

0 голосов
/ 24 января 2019

У меня было то же исключение утверждения:

Compute Function(k_1x3_R_1x_5y_f): missing buffer binding at index 1 for wt[0].

... при использовании MPSImageConvolution.Я изменил свое ядро ​​так, чтобы нулевые значения в матрице стали 0.0001.В вашем случае вы могли бы изменить lapKernel на:

   let lapKernel: [Float] =
    [
        0.0001, 1.0, 0.0001,
        1.0, -4.0, 1.0,
        0.0001, 1.0, 0.0001
    ]

... который, как я обнаружил, предотвратил исключение утверждения и, надеюсь, существенно не изменит функциональность фильтра изображений.

Кстати, определение ; после lapKernel в вашем примере излишне (извиняюсь, если я утверждаю очевидное)

...