AVFoundation depthData.depthDataMap иногда имеет значение null на iPhone 12 Pro.
Я разработал собственный Camera ViewController, используя библиотеку камер AVFoundation, чтобы получать высококачественные изображения со встроенными данными о глубине, как описано здесь https://developer.apple.com/videos/play/wwdc2017/507/.
Для этого я настроил объекты AVCapturePhotoSettings и AVCapturePhotoOutput с этими параметрами, связанными с глубиной, как описано в документации:
let photoOutput = AVCapturePhotoOutput()
photoOutput.isHighResolutionCaptureEnabled = true
photoOutput.setPreparedPhotoSettingsArray([AVCapturePhotoSettings(format: [AVVideoCodecKey: AVVideoCodecType.jpeg])], completionHandler: nil)
if photoOutput.isDepthDataDeliverySupported {
photoOutput.isDepthDataDeliveryEnabled = true
}
а также
let photoSettings = AVCapturePhotoSettings()
if photoOutput.isDepthDataDeliverySupported {
photoSettings.isDepthDataDeliveryEnabled = true
photoSettings.embedsDepthDataInPhoto = true
photoSettings.isDepthDataFiltered = false
}
Я добился того, что захват глубины работает, предоставляя 16-битную карту глубины в формате jpeg, но в некоторых конкретных случаях, таких как:
- однородный нетекстурированный фон (например, стена) с прислоненными к нему предметами
- объекты переднего плана ближе к двойной камере, чем 25/20 сантиметров
карта глубины вообще не генерируется, т. е . объект AVCapturePhoto имеет набор объектов depthData , но CVPixelBuffer depthDataMap недоступен. Как следствие, полученный JPEG не содержит данных о глубине.
Кто-то уже встречался с этой проблемой? И в случае, если есть способ решить это?
Ожидаемое поведение?
Как написано здесь в комментарии
[..] Карты глубины могут иметь дыры. Но для фотографий (AVCapturePhotoOutput) DualCamera может занять больше времени и создать изображение более высокого качества (до 768x576). DualCamera использует другой алгоритм (более высокое качество, более высокая задержка) для фотографий по сравнению с DepthDataOutput. Генерация по-прежнему несоответствия более высокого качества — это предложение по принципу «все или ничего» — оно не создает разреженную глубину, как это делает алгоритм DepthDataOutput в реальном времени. Таким образом, в нем никогда нет дырок и нет разницы между фильтрованным и нефильтрованным. [..]
кажется, что это ожидаемое поведение, т.е. если система не может создать достаточно хорошую карту глубины, она не даст никакого результата вместо создания карты глубины с некоторыми частями, помеченными как «дыры», но я хотел бы иметь некоторые отзывы, прежде чем убедиться в этом.