【发布时间】:2021-06-12 04:22:52
【问题描述】:
我在新 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 图像没有任何问题。但是,深度图有时绝对是空的(而我在渲染深度图时会看到更好的深度图)。所以,我猜CVPixelBuffer-to-UIImage 转换有问题。我对 Swift 完全陌生,我不知道它会是什么。
我发现CVPixelBuffer 是非平面的,所以我猜这是我的问题,但我不知道该怎么做,也没有找到任何解释如何继续的答案。
那么,如何正确地将非平面CVPixelBuffer 与sceneDepth.depthMap 转换为UIImage?
【问题讨论】:
标签: swift uiimage cvpixelbuffer