Verwenden von Bildtransformationen des Azure Kinect Sensor SDK
Führen Sie die spezifischen Funktionen aus, um Bilder zwischen koordinierten Kamerasystemen in Azure Kinect DK zu verwenden und zu transformieren.
k4a_transformation-Funktionen
Alle Funktionen mit dem Präfix k4a_transformation werden auf ganze Bilder angewandt. Diese Funktionen erfordern das Transformationshandle k4a_transformation_t, das über k4a_transformation_create() abgerufen wird, und ihre Zuordnung wird über k4a_transformation_destroy() aufgehoben. Informationen finden Sie auch auf GitHub im Transformation-Beispiel für das SDK, das die Verwendung der drei in diesem Thema beschriebenen Funktionen veranschaulicht.
Die folgenden Funktionen werden behandelt:
k4a_transformation_depth_image_to_color_camera()
k4a_transformation_depth_image_to_color_camera_custom()
k4a_transformation_color_image_to_depth_camera()
k4a_transformation_depth_image_to_point_cloud()
k4a_transformation_depth_image_to_color_camera
Übersicht
Die Funktion k4a_transformation_depth_image_to_color_camera() transformiert die Tiefenzuordnung vom Standpunkt der Tiefenkamera in den Standpunkt der Farbkamera. Diese Funktion ist so konzipiert, dass sogenannte RGB-D-Bilder generiert werden, wobei D einen zusätzlichen Bildkanal darstellt, der den Tiefenwert aufzeichnet. Wie in der folgenden Abbildung dargestellt, sehen das Farbbild und die Ausgabe von k4a_transformation_depth_image_to_color_camera() so aus, als ob sie vom gleichen Standpunkt aus aufgenommen wurden, d. h. vom Standpunkt der Farbkamera.
Implementierung
Diese Transformationsfunktion ist komplexer als der einfache Aufruf von k4a_calibration_2d_to_2d() für jedes Pixel. Die Funktion verzerrt ein Dreiecksgitter aus der Geometrie der Tiefenkamera in die Geometrie der Farbkamera. Das Dreiecksgitter wird verwendet, um zu vermeiden, dass Lücken im transformierten Tiefenbild generiert werden. Ein Z-Puffer stellt sicher, dass Verdeckungen ordnungsgemäß verarbeitet werden. Für diese Funktion ist standardmäßig die GPU-Beschleunigung aktiviert.
Parameter
Eingabeparameter sind das Transformationshandle und ein Tiefenbild. Die Auflösung des Tiefenbilds muss mit dem Wert für depth_mode
übereinstimmen, der bei der Erstellung des Transformationshandles angegeben wird. Wenn das Transformationshandle z. B. im Modus K4A_DEPTH_MODE_WFOV_UNBINNED
mit 1.024 × 1.024 erstellt wurde, muss die Auflösung des Tiefenbilds 1.024 × 1.024 Pixel betragen. Bei der Ausgabe handelt es sich um ein transformiertes Tiefenbild, das vom Benutzer durch Aufrufen von k4a_image_create() zugeordnet werden muss. Die Auflösung des transformierten Tiefenbilds muss mit dem Wert für color_resolution
übereinstimmen, der bei der Erstellung des Transformationshandles angegeben wird. Wenn die Farbauflösung beispielsweise auf K4A_COLOR_RESOLUTION_1080P
festgelegt wurde, muss die Auflösung des Ausgabebilds 1.920 × 1.080 Pixel betragen. Die Größe des Ausgabebilds wird auf width * sizeof(uint16_t)
festgelegt, da im Bild 16-Bit-Tiefenwerte gespeichert werden.
k4a_transformation_depth_image_to_color_camera_custom
Übersicht
Die Funktion k4a_transformation_depth_image_to_color_camera_custom() transformiert die Tiefenzuordnung und ein benutzerdefiniertes Bild vom Standpunkt der Tiefenkamera in den Standpunkt der Farbkamera. Als Erweiterung von k4a_transformation_depth_image_to_color_camera() ist diese Funktion so konzipiert, dass zusätzlich zum transformierten Tiefenbild ein entsprechendes benutzerdefiniertes Bild generiert wird, für das jedes Pixel mit den entsprechenden Pixelkoordinaten der Farbkamera übereinstimmt.
Implementierung
Diese Transformationsfunktion generiert das transformierte Tiefenbild auf die gleiche Weise wie k4a_transformation_depth_image_to_color_camera(). Zum Transformieren des benutzerdefinierten Bilds umfasst diese Funktion Optionen zur Verwendung der linearen Interpolation oder der Interpolation der Pixelwiederholung. Durch Verwendung der linearen Interpolation können neue Werte im transformierten benutzerdefinierten Bild erstellt werden. Die Verwendung der Interpolation der Pixelwiederholung verhindert, dass Werte, die im ursprünglichen Bild nicht vorhanden sind, in das Ausgabebild aufgenommen werden, führt jedoch zu einem weniger geglätteten Bild. Das benutzerdefinierte Bild muss in einem einzelnen Kanal mit 8 Bit oder 16 Bit erstellt werden. Für diese Funktion ist standardmäßig die GPU-Beschleunigung aktiviert.
Parameter
Eingabeparameter sind das Transformationshandle, ein Tiefenbild, ein benutzerdefiniertes Bild und der Interpolationstyp. Die Auflösung des Tiefenbilds und des benutzerdefinierten Bilds muss mit dem Wert für depth_mode
übereinstimmen, der bei der Erstellung des Transformationshandles angegeben wird. Wenn das Transformationshandle z. B. im Modus K4A_DEPTH_MODE_WFOV_UNBINNED
mit 1.024 × 1.024 erstellt wurde, muss die Auflösung des Tiefenbilds und des benutzerdefinierten Bilds 1.024 × 1.024 Pixel betragen. Der Wert für interpolation_type
muss K4A_TRANSFORMATION_INTERPOLATION_TYPE_LINEAR
oder K4A_TRANSFORMATION_INTERPOLATION_TYPE_NEAREST
sein. Bei der Ausgabe handelt es sich um ein transformiertes Tiefenbild und ein transformiertes benutzerdefiniertes Bild, die vom Benutzer durch Aufrufen von k4a_image_create() zugeordnet werden müssen. Die Auflösung des transformierten Tiefenbilds und des transformierten benutzerdefinierten Bilds muss mit dem Wert für color_resolution
übereinstimmen, der bei der Erstellung des Transformationshandles angegeben wird. Wenn die Farbauflösung beispielsweise auf K4A_COLOR_RESOLUTION_1080P
festgelegt wurde, muss die Auflösung des Ausgabebilds 1.920 × 1.080 Pixel betragen. Die Größe des Ausgabetiefenbilds wird auf width * sizeof(uint16_t)
festgelegt, da im Bild 16-Bit-Tiefenwerte gespeichert werden. Das benutzerdefinierte Eingabebild und das transformierte benutzerdefinierte Bild müssen das Format K4A_IMAGE_FORMAT_CUSTOM8
oder K4A_IMAGE_FORMAT_CUSTOM16
aufweisen. Die zugehörige Bildgröße muss entsprechend festgelegt werden.
k4a_transformation_color_image_to_depth_camera
Übersicht
Die Funktion k4a_transformation_color_image_to_depth_camera() transformiert das Farbbild vom Standpunkt der Farbkamera in den Standpunkt der Tiefenkamera (siehe Abbildung oben). Mit dieser Funktion können RGB-D-Bilder generiert werden.
Implementierung
Die Funktion verwendet für jedes Pixel der Tiefenzuordnung den Tiefenwert des Pixels, um die entsprechende Subpixelkoordinate im Farbbild zu berechnen. Anschließend wird nach dem Farbwert an dieser Koordinate im Farbbild gesucht. Im Farbbild wird die bilineare Interpolation ausgeführt, um den Farbwert mit Subpixelgenauigkeit abzurufen. Ein Pixel ohne zugeordnete Tiefenmessung wird dem BGRA-Wert [0,0,0,0]
im Ausgabebild zugewiesen. Für diese Funktion ist standardmäßig die GPU-Beschleunigung aktiviert. Da bei dieser Methode Lücken im transformierten Farbbild generiert und Verdeckungen nicht verarbeitet werden, empfiehlt es sich, stattdessen die Funktion k4a_transformation_depth_image_to_color_camera() zu verwenden.
Parameter
Eingabeparameter sind das Transformationshandle, ein Tiefenbild und ein Farbbild. Die Auflösung des Tiefenbilds und des Farbbilds muss mit den Werten für „depth_mode“ und „color_resolution“ übereinstimmen, die bei der Erstellung des Transformationshandles angegeben wurden. Bei der Ausgabe handelt es sich um ein transformiertes Farbbild, das vom Benutzer durch Aufrufen von k4a_image_create() zugeordnet werden muss. Die Auflösung des transformierten Farbbilds muss mit dem Wert für „depth_resolution“ übereinstimmen, der bei der Erstellung des Transformationshandles angegeben wurde. Im Ausgabebild werden vier 8-Bit-Werte gespeichert, die den BGRA-Wert für jedes Pixel darstellen. Daher ist width * 4 * sizeof(uint8_t)
als Größe des Bilds festgelegt. Die Datenreihenfolge liegt als Pixelinterleave vor, d. h. Blauwert – Pixel 0, Grünwert – Pixel 0, Rotwert – Pixel 0, Alphawert – Pixel 0, Blauwert – Pixel 1 usw.
k4a_transformation_depth_image_to_point_cloud
Übersicht
Mit der Funktion k4a_transformation_depth_image_to_point_cloud() wird eine mit einer Kamera erstellte 2D-Tiefenzuordnung in eine 3D-Punktwolke im Koordinatensystem der Kamera umgewandelt. Bei der Kamera kann es sich somit um die Tiefenkamera oder die Farbkamera handeln.
Implementierung
Diese Funktion liefert gleichwertige Ergebnisse wie die Ausführung von k4a_calibration_2d_to_2d() für jedes Pixel, ist aber rechnerisch effizienter. Beim Aufrufen von k4a_transformation_create() wird eine sogenannte XY-Nachschlagetabelle vorausberechnet, in der X- und Y-Skalierungsfaktoren für jedes Bildpixel gespeichert sind. Beim Aufrufen von k4a_transformation_depth_image_to_point_cloud() wird die 3D-X-Koordinate eines Pixels durch Multiplikation des X-Skalierungsfaktors des Pixels mit der Z-Koordinate des Pixels berechnet. Analog dazu wird die 3D-Y-Koordinate durch Multiplikation mit dem Y-Skalierungsfaktor berechnet. Das fastpointcloud-Beispiel des SDK veranschaulicht, wie die XY-Tabelle berechnet wird. Benutzer können den Beispielcode verwenden, um ihre eigene Version dieser Funktion zu implementieren, z. B. um die GPU-Pipeline zu beschleunigen.
Parameter
Eingabeparameter sind das Transformationshandle, ein Kameraspezifizierer und ein Tiefenbild. Wenn der Kameraspezifizierer auf die Tiefenkamera festgelegt ist, muss die Auflösung des Tiefenbilds mit dem Wert für „depth_mode“ übereinstimmen, der bei der Erstellung des Transformationshandles angegeben wird. Wenn der Spezifizierer dagegen auf die Farbkamera festgelegt ist, muss die Auflösung mit der Auflösung des ausgewählten Werts für „color_resolution“ übereinstimmen. Bei dem Ausgabeparameter handelt es sich um ein XYZ-Bild, das vom Benutzer durch Aufrufen von k4a_image_create() zugeordnet werden muss. Die Auflösung des XYZ-Bilds muss mit der Auflösung der Eingabetiefenzuordnung übereinstimmen. Für jedes Pixel werden drei signierte 16-Bit-Koordinatenwerte in Millimeter gespeichert. Die Größe des XYZ-Bilds wird daher auf width * 3 * sizeof(int16_t)
festgelegt. Die Datenreihenfolge liegt als Pixelinterleave vor, d. h. X-Koordinate – Pixel 0, Y-Koordinate – Pixel 0, Z-Koordinate – Pixel 0, X-Koordinate – Pixel 1 usw. Wenn ein Pixel nicht in 3D konvertiert werden kann, weist die Funktion dem Pixel die Werte [0,0,0]
zu.
Beispiele
Nächste Schritte
Sie haben sich mit der Verwendung der Funktionen des Azure Kinect Sensor SDK zur Bildtransformation vertraut gemacht. Daher können Sie sich nun folgendem Thema widmen:
Außerdem können Sie sich mit folgendem Thema beschäftigen: