gpt4 book ai didi

ios - 将深度数据(16 位深度)作为辅助数据存储在 JPEG 文件中

转载 作者:行者123 更新时间:2023-12-03 09:17:35 24 4
gpt4 key购买 nike

我希望能够将 iOS 中捕获的 ARframe 的深度数据存储在 中无损压缩图像文件。

根据this WWDC 演讲:

“在 iOS 11 中,我们支持两种有深度的图像。
第一个是 HEIF HEVC,新格式,也称为 HEIC 文件,在那里,对深度有一流的支持……我们支持的第二种格式是 JPEG。天啊,JPEG 本来就不是用来做这种把戏的,但我们还是让它做这个把戏。该 map 是 8 位有损 JPEG 如果它被过滤,或者如果它没有数字,我们使用 16 位无损 JPEG 编码来保留所有的非数字,我们将它存储为底部的第二个图像JPEG,所以它就像一个多画面对象,如果你熟悉的话。”

当我将原始深度缓冲区(16 位)与从存储的图像像素中检索的深度缓冲区进行比较时,我得到以下结果:
First Second
0.61865234 0.6196289
0.62109375 0.6196289
0.6269531 0.6274414
0.6298828 0.63134766
0.6328125 0.63134766
nan 0.003921509
nan 0.0
nan 0.0
nan 0.007843018
nan 0.003921509

即使我有未过滤的带有 NAN 的深度数据,存储的数据也无法保留它们,也没有像看起来那样使用无损编码

这是我写的代码:

if let currentFrame = session.currentFrame, let depthData = currentFrame.capturedDepthData { // The session variable is an ARSession object  
let outputURL: URL? = filePath(forKey: "test")
guard let cgImageDestination = CGImageDestinationCreateWithURL(outputURL! as CFURL, kUTTypeJPEG, 1, nil) else {
return
}

depthData.depthDataMap.normalize() // Normalizing depth data between 0.0 and 1.0
let sixteenBitDepthData = depthData.converting(toDepthDataType: kCVPixelFormatType_DepthFloat16)

let ciImage = CIImage(cvPixelBuffer: currentFrame.capturedImage)
let context = CIContext(options: nil)
let dict: NSDictionary = [
kCGImageDestinationLossyCompressionQuality: 1.0,
kCGImagePropertyIsFloat: kCFBooleanTrue,
]
if let cgImage: CGImage = context.createCGImage(ciImage, from: ciImage.extent) {
CGImageDestinationAddImage(cgImageDestination, cgImage, nil)
}

var auxDataType: NSString?
let auxData = sixteenBitDepthData.dictionaryRepresentation(forAuxiliaryDataType: &auxDataType)
CGImageDestinationAddAuxiliaryDataInfo(cgImageDestination, auxDataType!, auxData! as CFDictionary)

CGImageDestinationFinalize(cgImageDestination)

if let second = getDepthBufferFromFile(key: "test") {
self.compareBuffers(first: sixteenBitDepthData.depthDataMap, second: second)
}
}

最佳答案

JPEG 的性质文件使您的试验毫无意义。 iOS 支持 8 位 3 channel JPEG 或 16 位 8 channel JPEG。但是,允许存储真实深度信息的文件格式,如无损 OpenEXR文件确实支持 1023 channel 内的 32 位颜色数据。这种颜色深度对于保持稳健的场景深度是必要的。这样数量的 channel 对于存储额外的有用 channel 是必要的。
因此,在我看来,在您的情况下,最简单的解决方案是使用 32 位未压缩或压缩 EXR用于存储深度、Alpha、Disparity、Motion 和其他 channel 的文件,而不是 Apple“手工制作”的 16 位 JPEG 文件。

关于ios - 将深度数据(16 位深度)作为辅助数据存储在 JPEG 文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58269906/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com