Получите мультимедиа с 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 и добавить ее к своему собственному изображению.
- создать словарь глубины / диспаратности, подобный тому, который задокументирован в
CGImageSource.h
CGImageSourceCopyAuxiliaryDataInfoAtIndex
- однако, более подробно:
ключ 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
) - метаданные
Это значение не является обязательным.
- Создайте AVDepthData с помощью init(fromDictionaryRepresentation: [AnyHashable: Any]), передав словарь, созданный выше.
Создайте изображение, используя 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+. Вот несколько из них.