Använda Azure Kinect Sensor SDK-avbildningstransformeringar
Följ de specifika funktionerna för att använda och transformera bilder mellan koordinerade kamerasystem i Azure Kinect DK.
k4a_transformation funktioner
Alla funktioner som är prefix med k4a_transformation fungerar på hela bilder. De kräver att transformeringshandtaget k4a_transformation_t hämtas via k4a_transformation_create() och inte allokeras via k4a_transformation_destroy(). Du kan också referera till SDK-transformeringsexemplet som visar hur du använder de tre funktionerna i det här avsnittet.
Följande funktioner beskrivs:
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
Översikt
Funktionen k4a_transformation_depth_image_to_color_camera() omvandlar djupkartan från djupkamerans synvinkel till färgkamerans synvinkel. Den här funktionen är utformad för att producera så kallade RGB-D-avbildningar, där D representerar ytterligare en bildkanal som registrerar djupvärdet. Som du ser i bilden nedan ser färgbilden och utdata från k4a_transformation_depth_image_to_color_camera() ut som om de vore tagna från samma synvinkel, dvs. färgkamerans synvinkel.
Implementering
Den här transformeringsfunktionen är mer komplex än att bara anropa k4a_calibration_2d_to_2d() för varje pixel. Den förvränger ett triangelnät från djupkamerans geometri till färgkamerans geometri. Triangelnätet används för att undvika att generera hål i den transformerade djupbilden. En Z-buffert säkerställer att ocklusioner hanteras korrekt. GPU-acceleration är aktiverat för den här funktionen som standard.
Parametrar
Indataparametrar är transformeringshandtaget och en djupbild. Djupbildsupplösningen måste matcha den depth_mode
som angavs när transformeringshandtaget skapades. Om transformeringshandtaget till exempel skapades med läget 1024x1024 K4A_DEPTH_MODE_WFOV_UNBINNED
måste upplösningen för djupbilden vara 1 024 x 1024 bildpunkter. Utdata är en transformerad djupbild som måste allokeras av användaren via k4a_image_create (). Upplösningen för den transformerade djupbilden måste matcha den color_resolution
som angavs när transformeringshandtaget skapades. Om färgupplösningen till exempel har angetts till K4A_COLOR_RESOLUTION_1080P
måste upplösningen för utdatabilden vara 1920x1080 bildpunkter. Utdatabildens steg är inställt på width * sizeof(uint16_t)
, eftersom avbildningen lagrar 16-bitars djupvärden.
k4a_transformation_depth_image_to_color_camera_custom
Översikt
Funktionen k4a_transformation_depth_image_to_color_camera_custom() omvandlar djupkartan och en anpassad bild från djupkamerans synvinkel till färgkamerans synvinkel. Som ett tillägg till k4a_transformation_depth_image_to_color_camera()är den här funktionen utformad för att skapa en motsvarande anpassad bild som varje bildpunkt matchar motsvarande pixelkoordinater för färgkameran utöver den transformerade djupbilden.
Implementering
Den här transformeringsfunktionen genererar den transformerade djupbilden på samma sätt som k4a_transformation_depth_image_to_color_camera(). För att transformera den anpassade avbildningen tillhandahåller den här funktionen alternativ för att använda linjär interpolation eller närmaste granninterpolation. Om du använder linjär interpolering kan du skapa nya värden i den transformerade anpassade avbildningen. Om du använder närmaste granninterpolation förhindrar du att värden som inte finns i den ursprungliga bilden visas i utdatabilden, men resulterar i en mindre jämn bild. Den anpassade avbildningen ska vara 8-bitars eller 16-bitars enkel kanal. GPU-acceleration är aktiverat för den här funktionen som standard.
Parametrar
Indataparametrar är transformeringshandtaget, en djupbild, en anpassad bild och interpolationstypen. Djupbilden och den anpassade bildupplösningen måste matcha den depth_mode
som angavs när transformeringshandtaget skapades. Om transformeringshandtaget till exempel skapades med läget 1024x1024 K4A_DEPTH_MODE_WFOV_UNBINNED
måste upplösningen för djupbilden och den anpassade bilden vara 1 024 x 1 024 bildpunkter. interpolation_type
Ska vara antingen K4A_TRANSFORMATION_INTERPOLATION_TYPE_LINEAR
eller K4A_TRANSFORMATION_INTERPOLATION_TYPE_NEAREST
. Utdata är en transformerad djupbild och en transformerad anpassad avbildning som måste allokeras av användaren via k4a_image_create (). Upplösningen på den transformerade djupbilden och den transformerade anpassade avbildningen måste matcha den color_resolution
angivna när transformeringshandtaget skapas. Om färgupplösningen till exempel har angetts till K4A_COLOR_RESOLUTION_1080P
måste upplösningen för utdatabilden vara 1920x1080 bildpunkter. Utdatadjupets bildsteg är inställt på width * sizeof(uint16_t)
, eftersom avbildningen lagrar 16-bitars djupvärden. Den anpassade indatabilden och den transformerade anpassade avbildningen måste vara av format K4A_IMAGE_FORMAT_CUSTOM8
eller K4A_IMAGE_FORMAT_CUSTOM16
, motsvarande bildsteg ska anges i enlighet med detta.
k4a_transformation_color_image_to_depth_camera
Översikt
Funktionen k4a_transformation_color_image_to_depth_camera() omvandlar färgbilden från färgkamerans synvinkel till djupkamerans synvinkel (se bilden ovan). Den kan användas för att generera RGB-D-avbildningar.
Implementering
För varje bildpunkt på djupkartan använder funktionen pixelns djupvärde för att beräkna motsvarande subpixelkoordinat i färgbilden. Sedan letar vi upp färgvärdet på den här koordinaten i färgbilden. Bilinearinterpolation utförs i färgbilden för att få färgvärdet med precisionen subpixel. En pixel som inte har någon associerad djupavläsning tilldelas ett BGRA-värde [0,0,0,0]
för i utdatabilden. GPU-acceleration är aktiverat för den här funktionen som standard. Eftersom den här metoden genererar hål i den transformerade färgbilden och inte hanterar ocklusioner rekommenderar vi att du använder funktionen k4a_transformation_depth_image_to_color_camera() i stället.
Parametrar
Indataparametrarna är transformeringshandtaget, en djupbild och en färgbild. Upplösningarna för djup- och färgbilder måste matcha depth_mode och color_resolution som anges när transformeringshandtaget skapas. Utdata är en transformerad färgbild som måste allokeras av användaren via k4a_image_create (). Upplösningen för den transformerade färgbilden måste matcha den depth_resolution som angavs när transformeringshandtaget skapades. Utdatabilden lagrar fyra 8-bitars värden som representerar BGRA för varje pixel. Därför är width * 4 * sizeof(uint8_t)
avbildningens steg . Dataordningen är pixelinterfolierad, dvs. blått värde - pixel 0, grönt värde - pixel 0, rött värde - pixel 0, alfavärde - pixel 0, blått värde - pixel 1 och så vidare.
k4a_transformation_depth_image_to_point_cloud
Översikt
Funktionen k4a_transformation_depth_image_to_point_cloud() konverterar en 2D-djupkarta som tas av en kamera till ett 3D-punktsmoln i koordinatsystemet för samma kamera. Kameran kan därmed vara djupet eller färgkameran.
Implementering
Funktionen ger motsvarande resultat till att köra k4a_calibration_2d_to_2d() för varje pixel, men är beräkningsmässigt effektivare. När vi anropar k4a_transformation_create(), förberäknar vi en så kallad xy-lookup-tabell som lagrar x- och y-skalningsfaktorer för varje bildpixel. När vi anropar k4a_transformation_depth_image_to_point_cloud()får vi en pixels 3D X-koordinat genom att multiplicera pixelns x-skalningsfaktor med pixelns Z-koordinat. På motsvarande sätt beräknas 3D Y-koordinaten med multiplikation med y-skalningsfaktorn. Exemplet på snabbpunktsmoln i SDK visar hur xy-tabellen beräknas. Användare kan följa exempelkoden för att implementera sin egen version av den här funktionen, till exempel för att påskynda GPU-pipelinen.
Parametrar
Indataparametrarna är transformeringshandtaget, en kameraspecificerare och en djupbild. Om kameraspecificeraren är inställd på djup måste upplösningen på djupbilden matcha den depth_mode som angavs när transformeringshandtaget skapades. Annars, om specificeraren är inställd på färgkameran, måste upplösningen matcha upplösningen för den valda color_resolution. Utdataparametern är en XYZ-avbildning som måste allokeras av användaren via k4a_image_create (). XYZ-bildupplösningen måste matcha upplösningen för djupkartan för indata. Vi lagrar tre signerade 16-bitars koordinatvärden i millimeter för varje pixel. XYZ-avbildningssteget är därför inställt på width * 3 * sizeof(int16_t)
. Dataordningen är pixelinterfolierad, d.v.s. X-koordinat – pixel 0, Y-koordinat – pixel 0, Z-koordinat – pixel 0, X-koordinat – pixel 1 och så vidare. Om en pixel inte kan konverteras till 3D tilldelar funktionen värdena [0,0,0]
till pixeln.
Exempel
Nästa steg
Nu när du vet hur du använder SDK-bildtransformeringsfunktioner för Azure Kinect-sensorn kan du också lära dig mer om
Du kan också granska