Извините, я продублировал этот вопрос Как собрать 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?Правильно ли я создал буфер несоответствия в первую очередь?
Помимо этой проблемы было бы здорово, если бы кто-то мог направить меня к некоторому образцу кода о том, как все это сделать.