Как создать данные глубины и добавить их к изображению? - PullRequest
0 голосов
/ 28 мая 2019

Извините, я продублировал этот вопрос Как собрать AVDepthData вручную , потому что у него нет ответов, которые я хочу, и у меня нет достаточно представителей, чтобы комментировать там.Если вы не возражаете, я мог бы удалить свой вопрос в будущем и попросить кого-нибудь переместить будущие ответы на эту тему.

Итак, моя цель - создать данные глубины и прикрепить их к произвольному изображению.Есть статья о том, как это сделать https://developer.apple.com/documentation/avfoundation/avdepthdata/creating_auxiliary_depth_data_manually,, но я не знаю, как реализовать какой-либо шаг в этом направлении.Я не буду публиковать все вопросы сразу и начну с первого.

В качестве первого шага изображение глубины необходимо преобразовать в пиксел из градаций серого в значения глубины или диспаратности.Я взял этот фрагмент из вышеупомянутой темы:

func buildDepth(image: UIImage) -> AVDepthData? {
        let width = Int(image.size.width)
        let height = Int(image.size.height)
        var maybeDepthMapPixelBuffer: CVPixelBuffer?
        let status = CVPixelBufferCreate(kCFAllocatorDefault, width, height, kCVPixelFormatType_DisparityFloat32, nil, &maybeDepthMapPixelBuffer)

        guard status == kCVReturnSuccess, let depthMapPixelBuffer = maybeDepthMapPixelBuffer else {
            return nil
        }

        CVPixelBufferLockBaseAddress(depthMapPixelBuffer, .init(rawValue: 0))

        guard let baseAddress = CVPixelBufferGetBaseAddress(depthMapPixelBuffer) else {
            return nil
        }

        let buffer = unsafeBitCast(baseAddress, to: UnsafeMutablePointer<Float32>.self)

        for i in 0..<width * height {
            buffer[i] = 0 // disparity must be calculated somehow, but set to 0 for testing purposes
        }

        CVPixelBufferUnlockBaseAddress(depthMapPixelBuffer, .init(rawValue: 0))

        let info: [AnyHashable: Any] = [kCGImagePropertyPixelFormat: kCVPixelFormatType_DisparityFloat32,
                                        kCGImagePropertyWidth: image.size.width,
                                        kCGImagePropertyHeight: image.size.height,
                                        kCGImagePropertyBytesPerRow: CVPixelBufferGetBytesPerRow(depthMapPixelBuffer)]

        let metadata = generateMetadata(image: image)
        let dic: [AnyHashable: Any] = [kCGImageAuxiliaryDataInfoDataDescription: info,
// I get an error when converting baseAddress to CFData
                                       kCGImageAuxiliaryDataInfoData: baseAddress as! CFData,
                                       kCGImageAuxiliaryDataInfoMetadata: metadata]

        guard let depthData = try? AVDepthData(fromDictionaryRepresentation: dic) else {
            return nil
        }

        return depthData
    }

Затем в статье говорится, что базовый адрес пиксельного буфера (в котором находится карта диспаратности) загружается как CFData и передается как значение kCGImageAuxiliaryDataInfoData вCFDictionary.Но я получаю сообщение об ошибке при преобразовании baseAddress в CFData.Я тоже пытался конвертировать пиксельный буфер, но без удачи.Что я должен передать как kCGImageAuxiledDataInfoData?Правильно ли я создал буфер несоответствия в первую очередь?

Помимо этой проблемы было бы здорово, если бы кто-то мог направить меня к некоторому образцу кода о том, как все это сделать.

...