Сохранение данных глубины (с 16-битной глубиной) в качестве вспомогательных данных в файле JPEG в приложении для iOS - PullRequest
6 голосов
/ 07 октября 2019

Я хочу иметь возможность хранить данные глубины захваченного ARframe в iOS в сжатом файле изображения без потерь .

Согласно этой беседе с WWDC:

"В iOS 11 мы поддерживаем два типа изображений с глубиной. Первый - HEIF HEVC, новый формат, также называемый HEICфайлы, и там, есть первоклассная поддержка глубины ... Второй формат, который мы поддерживаем, это JPEG. Мальчик, JPEG не должен был делать подобные трюки, но мы все равно сделали этот трюк. Карта 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)
        }
    }
...