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

Как лучше всего создавать приложения для AVDepthData, не имея iPhone 7+?

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

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


person Guig    schedule 28.06.2017    source источник


Ответы (3)


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

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

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

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

person klinger    schedule 14.07.2017

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

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

Клавиша kCGImageAuxiliaryDataInfoData - (CFDataRef) - данные глубины

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

  • kCVPixelFormatType_DisparityFloat16 = 'hdis', /* IEEE754-2008 binary16 (половина числа с плавающей запятой), описывающий нормализованный сдвиг при сравнении двух изображений. Единицы: 1/метры: ( pixelShift / (pixelFocalLength * baselineInMeters)) */
  • kCVPixelFormatType_DisparityFloat32 = 'fdis', /* IEEE754-2008 binary32 float, описывающий нормализованный сдвиг при сравнении двух изображений. Единицы: 1/метры: ( pixelShift / (pixelFocalLength * baselineInMeters)) */
  • kCVPixelFormatType_DepthFloat16 = 'hdep', /* IEEE754-2008 binary16 (полупоплавок), описывающий глубину (расстояние до объекта) в метрах */
  • 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 = depthData.dictionaryRepresentation(forAuxiliaryDataType: &auxDataType)

    // Add auxiliary data to image destination  
    CGImageDestinationAddAuxiliaryDataInfo(cgImageDestination, auxDataType!, auxData! as CFDictionary)  
    
    if CGImageDestinationFinalize(cgImageDestination) {  
        return data as Data  
    }  
    
person Bobjt    schedule 24.10.2017
comment
2) Создать AVDepthData... Как это сделать правильно? Метаданные не сохраняются stackoverflow.com/q/55043630/820795 - person Gralex; 07.03.2019

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

person Artem Novichkov    schedule 30.06.2017
comment
Статья относится к 2016 году, то есть к iOS10, поэтому я сомневаюсь, что данные о глубине уже присутствуют в экспортированных фотографиях. Но я подтвержу, что - person Guig; 30.06.2017
comment
Ты нашел что-нибудь, @Guig? - person triiiiista; 14.09.2017