Получите мультимедиа с AVDepthData без iPhone 7+

Каков наилучший способ создания приложений для AVDepthData без iPhone 7+?

Данные о глубине могут быть получены только на iPhone 7+, который имеет камеру с двумя объективами. Но я думаю, что любое устройство iOS11 может обрабатывать данные глубины, если оно имеет доступ к фотографиям, которые его содержат. Я не смог найти ни одного такого медиа-ресурса от Apple или других сторон в Интернете. У кого-нибудь есть? Или есть лучший способ?

Я пытался заглянуть в библиотеку симулятора iPhone 7+, но симулятор зависает, потому что он не поддерживает Metal, который используют демонстрационные приложения глубины.

3 ответа

Решение

Вам понадобится кто-то (например, я), у которого есть iPhone 7+ с iOS 11 для отправки вам изображения.

Перейдите по этой ссылке с Safari на iOS 11 и нажмите more... -> Save Image

http://hellocamera.co/img/depth-photo.heic

Примечание: я удалил данные GPS из этого изображения.

Хотя это и не является тривиальной задачей, можно сгенерировать AVDepthData и добавить ее к своему собственному изображению.

  1. создать словарь глубины / диспаратности, подобный тому, который задокументирован в CGImageSource.hCGImageSourceCopyAuxiliaryDataInfoAtIndex- однако, более подробно:

ключ kCGImageAuxiliaryDataInfoData - (CFDataRef) - глубина данных

Содержит только двоичный пиксельный буфер. Как и в случае с данными, которые вы извлекаете из пиксельного буфера, читая указатель в CVPixelBufferLockBaseAddress. Вы создаете CVPixelBuffer с форматом одного из поддерживаемых типов:

  • kCVPixelFormatType_DisparityFloat16 = 'hdis', / * IEEE754-2008 binary16 (half-float), описывающий нормализованный сдвиг при сравнении двух изображений. Единицы измерения 1/ метры: (pixelShift / (pixelFocalLength * baselineInMeters)) */
  • kCVPixelFormatType_DisparityFloat32 = 'fdis', / * IEEE754-2008 binary32 float, описывающий нормализованный сдвиг при сравнении двух изображений. Единицы измерения 1/ метры: (pixelShift / (pixelFocalLength * baselineInMeters)) */
  • kCVPixelFormatType_DepthFloat16 = 'hdep', / * IEEE754-2008 binary16 (half float), описывающая глубину (расстояние до объекта) в метрах */
  • kCVPixelFormatType_DepthFloat32 = 'fdep', / * IEEE754-2008 binary32 float, описывающий глубину (расстояние до объекта) в метрах */

Чтобы превратить произвольное изображение в градациях серого в буфер с фиктивной глубиной, вам нужно будет конвертировать по пикселям любые значения пикселей в градациях серого (от 0= черный до 1= белый, от zNear до zFar и т. Д.) В метрах или 1/ метрах в зависимости от в вашем целевом формате. И приведите их в правильный формат с плавающей запятой, в зависимости от того, откуда вы их получаете.

ключ kCGImageAuxiliaryDataInfoDataDescription - (CFDictionary) - описание данных глубины

Сообщает вам, как интерпретировать этот буфер для того, что мы вам даем, или говорит нам, как интерпретировать буфер, который вы нам даете:

  • kCGImagePropertyPixelFormat является одним из форматов глубины / диспаратности CoreVideo/CVPixelBuffer.h
  • kCGImagePropertyWidth/Height - размеры в пикселях
  • kCGImagePropertyBytesPerRow правильно, что он говорит на жестяной банке

ключ kCGImageAuxiliaryDataInfoMetadata - (CGImageMetadataRef) - метаданные

Это значение не является обязательным.

  1. Создайте AVDepthData с помощью init(fromDictionaryRepresentation: [AnyHashable: Any]), передав словарь, созданный выше.
  2. Создайте изображение, используя ImageI / O:

    // create the image destination (not shown)
    
    // add an image to the destination
    CGImageDestinationAddImage(cgImageDestination, renderedCGImage, attachments)  
    
    // Use AVDepthData to get auxiliary data dictionary          
    

    var auxDataType: NSString?

    let auxData = deepData.dictionaryRepresentation(forAuxiledDataType: &auxDataType)

    // Add auxiliary data to image destination  
    CGImageDestinationAddAuxiliaryDataInfo(cgImageDestination, auxDataType!, auxData! as CFDictionary)  
    
    if CGImageDestinationFinalize(cgImageDestination) {  
        return data as Data  
    }  
    

Я думаю, вы можете обрабатывать данные о глубине фотографий на любом устройстве iOS. Все, что вам нужно, это образцы фотографий, снятых на iPhone 7+. Вот несколько из них.

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