2017-06-28 5 views
1

Was ist der beste Weg, Apps für die AVDepthData zu erstellen, ohne ein iPhone 7+ zu besitzen?Medien mit AVDepthData ohne iPhone herunterladen 7+

Die Tiefendaten können nur auf dem iPhone 7+ aufgenommen werden, das über die Dual-Objektive-Kamera verfügt. Aber ich denke, jedes iOS11-Gerät kann die Tiefendaten verarbeiten, vorausgesetzt, es hat Zugriff auf Fotos, die es enthalten. Ich konnte keine solche Medienressource von Apple oder anderen online finden. Hat jemand was? Oder gibt es einen besseren Weg?

Ich habe versucht, in die Simulatorbibliothek des iPhone 7+ zu schauen, aber der Simulator stürzt ab, weil er Metal nicht unterstützt, den die Tiefendemo apps verwenden.

Antwort

2

Sie benötigen jemanden (wie mich), der ein iPhone 7+ mit iOS 11 hat, um Ihnen ein Bild zu senden.

Besuchen Sie diesen Link mit Safari auf iOS 11 und tippen more... ->Save Image

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

Hinweis: ich die GPS-Daten von diesem Bild entfernt.

+0

Ausgezeichnet, danke! – Guig

0

Ich denke, Sie können mit den Tiefen Daten von Fotos auf jedem iOS-Gerät umgehen. Alles, was Sie brauchen, sind Samples von Fotos, die mit dem iPhone 7+ aufgenommen wurden. Here sind ein paar von ihnen.

+0

Der Artikel ist ab 2016 also iOS10, so dass ich bezweifle, dass die Tiefendaten in den exportierten Fotos bereits vorhanden ist. Aber ich werde bestätigen, dass – Guig

+0

Haben Sie etwas gefunden, @Guig? – triiiiista

1

Obwohl es sich um eine nicht-triviale Aufgabe handelt, ist es möglich, AVDepthData zu generieren und sie zu Ihrem eigenen Bild hinzuzufügen.

  1. schaffen eine Tiefe/Disparität Wörterbuch wie das dokumentiert in CGImageSource.hCGImageSourceCopyAuxiliaryDataInfoAtIndex - jedoch folgende sind weitere Details:

Key kCGImageAuxiliaryDataInfoData - (CFDataRef) - die Tiefendaten

nur eine binäre Enthält Pixelpuffer. Wie in den Daten, die Sie aus einem Pixelpuffer ziehen, indem Sie den Zeiger in CVPixelBufferLockBaseAddress lesen. Sie erstellen die CVPixelBuffer mit einem Format von einem der unterstützten Typen:

  • kCVPixelFormatType_DisparityFloat16 = 'HDIs',/* IEEE754-2008 binary16 (Halb float), die normalisierte Verschiebung beschreiben, wenn zwei Bilder zu vergleichen. Einheiten sind 1/Meter: (pixelShift/(pixelFocalLength * baselineInMeters)) */
  • kCVPixelFormatType_DisparityFloat32 = 'fdis',/* IEEE754-2008 binary32 float, beschreibt die normalisierte Verschiebung beim Vergleich zweier Bilder. Einheiten sind 1/Meter: (pixelShift/(pixelFocalLength * baselineInMeters)) */
  • kCVPixelFormatType_DepthFloat16 = 'hdep',/* IEEE754-2008 binary16 (halb float), beschreibt die Tiefe (Abstand zu einem Objekt) in Metern */
  • kCVPixelFormatType_DepthFloat32 = 'FDEP',/* IEEE754-2008 binary32 float, beschreibt die Tiefe (Abstand zu einem Objekt) in m */

eine beliebige Graustufenbild in einen gefälschten Tiefenpuffer zu aktivieren, man‘ ll müssen pro Pixel konvertieren, was auch immer Ihre Graustufen Pixelwerte sind (0 = schwarz zu 1 = weiß, zNear zu zFar, etc) zu entweder Meter oder 1/Meter je nach Ihrem Zielformat. Und bringen Sie sie in das richtige Gleitkommaformat, je nachdem, woher Sie sie erhalten.

Key kCGImageAuxiliaryDataInfoDataDescription - (CFDictionary) - die Tiefendaten Beschreibung

erfahren Sie, wie diese Puffer für den wir Ihnen geben interpretieren, oder sagt uns, wie ein Puffer interpretieren Sie uns geben:

  • kCGImagePropertyPixelFormat ist einer der Corevideo/CVPixelBuffer.h Tiefe/Disparität Formate
  • kCGImagePropertyWidth/Höhe sind die Pixelabmessungen
  • kCGImagePropertyBytesPerRow ist richtig, was es auf dem Zinn sagt

Key kCGImageAuxiliaryDataInfoMetadata - (CGImageMetadataRef) - Metadaten

Dieser Wert ist optional.

  1. Erstellen Sie AVDepthData mit init(fromDictionaryRepresentation: [AnyHashable : Any]) und übergeben Sie das oben erstellte Wörterbuch.
  2. ein Bild erstellen ImageI/O mit:

    // 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?

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

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