2016-07-31 22 views
0

Ich erzeuge eine Tiefenkarte von den Punktwolkenpunkten, und um die fehlenden Daten auszufüllen, möchte ich den am nächsten passenden Farbrahmen betrachten. Ich kann ein Tiefenbild erzeugen (ich erzeuge es, wenn OnDepthAvailable aufgerufen wird), und ich sehe, dass das TangoAR-Einheitsbeispiel die Farbrahmen erhält, wenn OnExperimentalTangoImageAvailable aufgerufen wird.Sync Tiefe und Farbe

Dies ist aus der TangoAR Einheit Beispiel:

/// <summary> 
/// This will be called when a new frame is available from the camera. 
/// 
/// The first scan-line of the color image is reserved for metadata instead of image pixels. 
/// </summary> 
/// <param name="cameraId">Camera identifier.</param> 
public void OnExperimentalTangoImageAvailable(TangoEnums.TangoCameraId cameraId) 
{ 
    if (cameraId == TangoEnums.TangoCameraId.TANGO_CAMERA_COLOR) 
    { 
     m_screenUpdateTime = VideoOverlayProvider.RenderLatestFrame(TangoEnums.TangoCameraId.TANGO_CAMERA_COLOR); 

     // Rendering the latest frame changes a bunch of OpenGL state. Ensure Unity knows the current OpenGL state. 
     GL.InvalidateState(); 
    } 
} 

Allerdings mag ich den Rahmen direkt nach dem Tiefen Rahmen, nicht der letzte Frame zur Verfügung.

Wie kann ich die beiden so nahe wie möglich zu synchronisieren? Ein Blick auf das C RBG Depth Sync Beispiel hat mir nicht geholfen. Ich verstehe, dass Tiefe und Farbe die gleiche Kamera verwenden und dass beides nicht gleichzeitig möglich ist (1 Tiefe für alle 4 Farbrahmen).

+1

Sie können die Bilder in einer Karte speichern. Und verwenden Sie den Zeitstempel als Schlüssel und Farbbild als Wert. Dann können Sie nach dem Bild mit dem geringsten Zeitabstand zum Zeitstempel der Punktwolke suchen. Und Sie sollten die Kartengröße auf vielleicht 20 Bilder einstellen, um zu alte Bilder zu entfernen und um Speicher zu sparen. – bashbug

+0

Wie haben Sie das SDK in Unity3D arbeiten lassen? Für mich (und ungefähr 10 andere, die ich gefragt habe) stürzen die Demos immer nach ungefähr 30 Sekunden ab. –

Antwort

2

Es gibt mehrere Lösungen für dieses Problem, eine von ihnen ist als bashbug vorgeschlagen, die Rahmen-Puffer und Textur nachschlagen basierend auf am nächsten Zeitstempel.

Was würde ich vorschlagen, Pufferung nicht erforderlich, und es ist die Einheit spezifisch:

  1. Schalten Sie das Netz machen auf PointCloud, und stellen Sie die PointCloud Objekt zu einem bestimmten layer.

  2. Render PointCloud verwendet der Shader in this doc vorgeschlagen, aber stellen Sie sicher, dass Sie die color mask ausschalten, so dass der Punktwolke Farbpuffer machen nicht.

  3. erstellen RenderTexture und mit den depth format (wie die previous doc vorgeschlagen)

  4. Erstellen eine Kamera mit derselben intrinsischen (Projektionsmatrix) als TangoARCamera, und nur die PointCloud ‚s Schicht machen. Diese Kamera wird unsere Tiefenkamera sein (die Kamera gibt nur PointCloud aus).

  5. Legen Sie die Tiefenkamera als untergeordnetes Objekt des Objekts TangoARCamera ohne Versatz fest. Dies stellt sicher, dass die Kamera genau die gleiche Bewegung (Position und Orientierung) wie ARCamera hat.

  6. Erstellen Sie eine andere Rendertextur mit dem RGBA-Format, und weisen Sie diese Textur der TangoARCamera zu, um das Farbbild zu erhalten.

  7. Jetzt haben Sie zwei Texturen: Tiefe und Farbe. Sie werden garantiert synchronisiert, da in UnitySDK das PointCloud-Prefab tatsächlich einen Punkt im Welt-Space projiziert und die TangoARCamera-Transformation basierend auf dem Farbkamera-Timestamp aktualisiert wird.