使用 UIImageWriteToSavedPhotosAlbum 保存深度数据

问题描述

我在新 iPhone 设备上使用 ARKit 4 (+MetalKit),我试图访问深度数据(来自 LiDAR)并将其保存为深度图以及实际的 RGB 图像。虽然我看过很多演示,但没有展示用于实际可视化深度图的代码。我制作了一个按钮,这是与它一起使用的代码

func saveCapturedBuffer(buffer: CVPixelBuffer) {
    let depthCIImage = CIImage(cvPixelBuffer: buffer)
    let context: CIContext = CIContext.init(options: nil)
    let depthCGImage: CGImage = context.createCGImage(depthCIImage,from: depthCIImage.extent)!
    let depthUIImage = UIImage.init(cgImage: depthCGImage)
    UIImageWritetoSavedPhotosAlbum(depthUIImage,self,#selector(saveError),nil)
    }

@objc func capture(sender: UIButton) {
    let frame: ARFrame = session.currentFrame!
    guard let depthData =  frame.sceneDepth ?? frame.sceneDepth else { return }
    var pixelBufferDepth: CVPixelBuffer!
    pixelBufferDepth = depthData.depthMap
    saveCapturedBuffer(buffer: pixelBufferDepth)
    
    var capturedImageBuffer: CVPixelBuffer!
    capturedImageBuffer = frame.capturedImage
    print(CVPixelBufferGetPlaneCount(capturedImageBuffer))
    saveCapturedBuffer(buffer: capturedImageBuffer)
}

@objc func saveError(_ image: UIImage,didFinishSavingWithError error: Error?,contextInfo: UnsafeRawPointer) {
    if let error = error {
        print("error: \(error.localizedDescription)")
    } else { }
}

因此,RGB 图像由此代码保存,没有任何问题。但是,深度图有时绝对是空的(虽然我在渲染深度图时看到了更好的深度图)。所以,我猜 CVPixelBufferUIImage 的转换有问题。我对 Swift 完全陌生,我不知道它是什么。

我发现 CVPixelBuffer 是非平面的,所以我猜这是我的问题,但我既不知道该怎么做,也没有找到任何解释如何进行的答案.

那么,如何将带有CVPixelBuffer的非平面sceneDepth.depthMap正确转换为UIImage

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)