我已成功地在Python中为我的项目应用了openCVguidedFilter,现在我必须将此功能带到我的IOS应用程序中。我搜索了Apple开发人员网站,发现了一个名为MPSImageGuidedFilter的过滤器。我想它的工作方式与OpencVguidedFilter相似。但是,我在IOS编程方面的有限知识并不能让我弄清楚如何使用它。不幸的是,我也无法在网络上找到示例代码。有人使用过此过滤器吗?我非常感谢您的帮助。或者在MPS下使用任何过滤器的示例代码将有助于找出。过滤器的链接为:https://developer.apple.com/documentation/metalperformanceshaders/mpsimageguidedfilter
谢谢
[经过几天的努力,我设法制作了MPSImageGUidedFilter。请在下面查看要处理的代码:
import UIKit
导入MetalPerformanceShaders导入MetalKit
类ViewController:UIViewController {
public var texIn: MTLTexture!
public var coefficient: MTLTexture!
public var context: CIContext!
let device = MTLCreateSystemDefaultDevice()!
var queue: MTLCommandQueue!
var Metalview: MTKView { return view as! MTKView }
override func viewDidLoad() {
super.viewDidLoad()
Metalview.drawableSize.height = 412
Metalview.drawableSize.width = 326
Metalview.framebufferOnly = false
Metalview.device = device
Metalview.delegate = self
queue = device.makeCommandQueue()
let textureLoader = MTKTextureLoader(device: device)
let urlCoeff = Bundle.main.url(forResource: "mask", withExtension: "png")
do {
coefficient = try textureLoader.newTexture(URL: urlCoeff!, options: [:])
} catch {
fatalError("coefficient file not uploaded")
}
let url = Bundle.main.url(forResource: "guide", withExtension: "png")
do {
texIn = try textureLoader.newTexture(URL: url!, options: [:])
} catch {
fatalError("resource file not uploaded")
}
}
}
扩展名ViewController:MTKViewDelegate {
func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {}
func draw(in view: MTKView) {
guard let commandBuffer = queue.makeCommandBuffer(),
let drawable = view.currentDrawable else {
return
}
let shader = MPSImageGuidedFilter(device: device, kernelDiameter: 5)
shader.epsilon = 0.001
//让着色器= MPSImageGaussianBlur(device:device,sigma:3)
//让shader = MPSImageSobel(设备:设备)//让shader = MPSImageAreaMax(device:device,kernelWidth:3,kernelHeight:3)//让shader = MPSImageAreaMin(设备:设备,内核宽度:5,内核高度:5)//让shader = MPSImageMedian(设备:device,kernelDiameter:3)//让shader = MPSImageBox(设备:设备,内核宽度:9,内核高度:9)//让shader = MPSImageTent(设备:设备,kernelWidth:9,kernelHeight:9)
let textOut = drawable.texture
shader.encodeReconstruction(to: commandBuffer, guidanceTexture: texIn, coefficientsTexture: coefficient, destinationTexture: textOut)
// shader.encode(commandBuffer:commandBuffer,sourceTexture:texIn,destinationTexture:textOut)commandBuffer.present(drawable)commandBuffer.commit()
}
}