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 в реальном времени. Таким образом, в нем никогда нет дырок и нет разницы между фильтрованным и нефильтрованным. [..]

кажется, что это ожидаемое поведение, т.е. если система не может создать достаточно хорошую карту глубины, она не даст никакого результата вместо создания карты глубины с некоторыми частями, помеченными как «дыры», но я хотел бы иметь некоторые отзывы, прежде чем убедиться в этом.

0 ответов

Другие вопросы по тегам