2017-06-28 78 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   
    }