2017-06-28 59 views
1

什么是最好的方式来构建AVDepthData的应用程序没有拥有iPhone 7 +?获取媒体与AVDepthData没有iPhone 7+

深度数据只能在具有双镜头相机的iPhone 7+上捕捉。但我想任何iOS11设备都可以处理深度数据,只要它能够访问包含它的照片即可。我无法从Apple或其他在线人士那里找到任何此类媒体资源。有人有一些?或者,还有更好的方法?

我试过看看iPhone 7+模拟器库,但模拟器崩溃,因为它不支持深度演示应用程序正在使用的金属。

回答

2

你将需要有人(如我),它有一个iPhone 7 +与iOS 11的发送给你的图像。

访问iOS上11这个链接与Safari和挖掘more... - >Save Image

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

注:我从这个图像删除的GPS数据。

+0

非常好,谢谢! – Guig

0

我想你可以在任何iOS设备上处理照片的深度数据。所有你需要的是iPhone 7+拍摄的照片样本。 Here是其中的几个。

+0

的制品是从2016即iOS10,所以我怀疑深度数据已经存在于导出的照片。但我会确认 – Guig

+0

你有没有找到任何东西,@Guig? – triiiiista

1

虽然是非trival任务,但可以生成AVDepthData并将其添加到您自己的图像中。

  1. 创建深度/视差字典一样,在记录CGImageSource.hCGImageSourceCopyAuxiliaryDataInfoAtIndex - 但是,以下是详细信息:

主要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浮子,描述深度以米(距离的一个对象)*/

要开启的任意灰度图像为假深度缓冲器,你”您需要根据您的目标格式,将任何灰度像素值(0 =黑色到1 =白色,z接近zFar等)转换为米或1 /米。根据你从哪里得到它们,让它们进入正确的浮点格式。

主要kCGImageAuxiliaryDataInfoDataDescription - (CFDictionary) - 深度数据描述

告诉您如何解读该缓冲区的一个,我们给你,或者告诉我们如何解释一个缓冲你给我们:

  • kCGImagePropertyPixelFormat是的corevideo的/ CVPixelBuffer.h深度/视差格式之一
  • kCGImagePropertyWidth /高度是像素尺寸
  • 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?

    让AUXDATA = depthData.dictionaryRepresentation(forAuxiliaryDataType:& auxDataType)

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