本文內(nèi)容
● k4a_transformation 函數(shù)
● 示例
● 后續(xù)步驟
本文完全復(fù)用Azure Kinect DK的圖像轉(zhuǎn)換功能,主要實現(xiàn)D2C,C2D,深度轉(zhuǎn)點云的功能。
k4a_transformation 函數(shù)
k4a_transformation 是 Azure Kinect DK 用于協(xié)調(diào)相機系統(tǒng)之間去使用和轉(zhuǎn)換圖像。所有帶有 k4a_transformation 前綴的函數(shù)針對整個圖像運行。 它們需要通過 k4a_transformation_create() 獲取轉(zhuǎn)換句柄 k4a_transformation_t,并通過 k4a_transformation_destroy() 釋放句柄。 你還可以參考 SDK 轉(zhuǎn)換示例,演示了如何使用這幾個函數(shù)。
本文將介紹以下函數(shù):
● 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
概述
函數(shù) k4a_transformation_depth_image_to_color_camera() 將深度圖從深度相機的視點轉(zhuǎn)換為彩色相機的視點。 此函數(shù)旨在生成所謂的 RGB-D 圖像,其中,D 表示錄制深度值的附加圖像通道。 在下圖中可以看到,k4a_transformation_depth_image_to_color_camera() 輸出的深度圖像與彩色圖像如同它們?nèi)∽酝灰朁c(即,彩色相機的視點)。
實現(xiàn)
此轉(zhuǎn)換函數(shù)比單純針對每個像素調(diào)用 k4a_calibration_2d_to_2d() 更為復(fù)雜。 它將深度相機幾何結(jié)構(gòu)中的三角網(wǎng)格扭曲成彩色相機的幾何結(jié)構(gòu)。 使用三角網(wǎng)格可以避免轉(zhuǎn)換的深度圖像出現(xiàn)孔洞。 Z 緩沖區(qū)確保正確處理遮擋物。 默認已為此函數(shù)啟用 GPU 加速。
參數(shù)
輸入?yún)?shù)是轉(zhuǎn)換句柄和深度圖像。 深度圖像的分辨率必須與創(chuàng)建轉(zhuǎn)換句柄時指定的 depth_mode 相匹配。 例如,如果轉(zhuǎn)換句柄是使用 1024x1024 K4A_DEPTH_MODE_WFOV_UNBINNED 模式創(chuàng)建的,則深度圖像的分辨率必須是 1024x1024 像素。 輸出是需要由用戶調(diào)用 k4a_image_create() 分配的已轉(zhuǎn)換深度圖像。 已轉(zhuǎn)換的深度圖像的分辨率必須與創(chuàng)建轉(zhuǎn)換句柄時指定的 color_resolution 相匹配。 例如,如果彩色分辨率設(shè)置為 K4A_COLOR_RESOLUTION_1080P,則輸出圖像的分辨率必須是 1920x1080 像素。 輸出圖像步幅設(shè)置為 width * sizeof(uint16_t),因為圖像存儲 16 位深度值。
k4a_transformation_depth_image_to_color_camera_custom
概述
函數(shù) k4a_transformation_depth_image_to_color_camera_custom() 將深度圖和自定義圖像從深度相機的視點轉(zhuǎn)換為彩色相機的視點。 作為 k4a_transformation_depth_image_to_color_camera() 的擴展,此函數(shù)旨在能生成對應(yīng)的自定義圖像,其每個像素與彩色相機的相應(yīng)像素坐標(biāo)相匹配。
實現(xiàn)
此轉(zhuǎn)換函數(shù)生成轉(zhuǎn)換的深度圖像的方式與 k4a_transformation_depth_image_to_color_camera() 相同。 若要轉(zhuǎn)換自定義圖像,此函數(shù)提供了使用線性內(nèi)插或最近的鄰域內(nèi)插的選項。 使用線性內(nèi)插可以在轉(zhuǎn)換后的自定義圖像中創(chuàng)建新值。 使用最近的鄰域內(nèi)插將防止原始圖像中不存在的值出現(xiàn)在輸出圖像中,但會導(dǎo)致圖像不太平滑。 自定義圖像應(yīng)為單通道 8 位或 16 位。 默認已為此函數(shù)啟用 GPU 加速。
參數(shù)
輸入?yún)?shù)為轉(zhuǎn)換句柄、深度圖像、自定義圖像和內(nèi)插類型。 深度圖像和自定義圖像的分辨率必須與創(chuàng)建轉(zhuǎn)換句柄時指定的 depth_mode 相匹配。 例如,如果轉(zhuǎn)換句柄是使用 1024x1024 K4A_DEPTH_MODE_WFOV_UNBINNED 模式創(chuàng)建的,則深度圖像和自定義圖像的分辨率必須是 1024x1024 像素。 interpolation_type 應(yīng)為 K4A_TRANSFORMATION_INTERPOLATION_TYPE_LINEAR 或 K4A_TRANSFORMATION_INTERPOLATION_TYPE_NEAREST。 輸出是轉(zhuǎn)換后的深度圖像和轉(zhuǎn)換后的自定義圖像,需要由用戶通過調(diào)用 k4a_image_create() 來分配。 轉(zhuǎn)換后的深度圖像和轉(zhuǎn)換后的自定義圖像的分辨率必須與創(chuàng)建轉(zhuǎn)換句柄時指定的 color_resolution 相匹配。 例如,如果彩色分辨率設(shè)置為 K4A_COLOR_RESOLUTION_1080P,則輸出圖像的分辨率必須是 1920x1080 像素。 輸出深度圖像步幅設(shè)置為 width * sizeof(uint16_t),因為該圖像存儲 16 位深度值。 輸入的自定義圖像和轉(zhuǎn)換后的自定義圖像的格式必須為 K4A_IMAGE_FORMAT_CUSTOM8 或 K4A_IMAGE_FORMAT_CUSTOM16,應(yīng)相應(yīng)設(shè)置對應(yīng)的圖像步幅。
k4a_transformation_color_image_to_depth_camera
概述
函數(shù) k4a_transformation_color_image_to_depth_camera() 將彩色圖像從彩色相機的視點轉(zhuǎn)換為深度相機的視點(參閱上圖)。 使用此函數(shù)可以生成 RGB-D 圖像。
實現(xiàn)
對于深度圖的每個像素,該函數(shù)使用像素的深度值來計算彩色圖像中的相應(yīng)子像素坐標(biāo)。 然后,我們將在彩色圖像中的此坐標(biāo)處查找顏色值。 在彩色圖像中執(zhí)行雙線性內(nèi)插,以獲取子像素精度的顏色值。 沒有關(guān)聯(lián)的深度讀數(shù)的像素將分配到輸出圖像中的 BGRA 值 [0,0,0,0]。 默認已為此函數(shù)啟用 GPU 加速。 由于此方法會在轉(zhuǎn)換的彩色圖像中產(chǎn)生孔洞,并且不會處理遮擋物,因此我們建議改用函數(shù) k4a_transformation_depth_image_to_color_camera()。
參數(shù)
輸入?yún)?shù)是轉(zhuǎn)換句柄、深度圖像和彩色圖像。 深度圖像和彩色圖像的分辨率必須與創(chuàng)建轉(zhuǎn)換句柄時指定的 depth_mode 和 color_resolution 相匹配。 輸出是需要由用戶調(diào)用 k4a_image_create() 分配的已轉(zhuǎn)換彩色圖像。 已轉(zhuǎn)換的彩色圖像的分辨率必須與創(chuàng)建轉(zhuǎn)換句柄時指定的 depth_resolution 相匹配。 輸出圖像存儲四個 8 位值(表示每個像素的 BGRA)。 因此,圖像的步幅為 width * 4 * sizeof(uint8_t)。 數(shù)據(jù)順序為像素交錯式,即,藍色值 - 像素 0,綠色值 - 像素 0,紅色值 - 像素 0,alpha 值 - 像素 0,藍色值 - 1,依此類推。
k4a_transformation_depth_image_to_point_cloud
概述
函數(shù) k4a_transformation_depth_image_to_point_cloud() 將相機拍攝的 2D 深度圖轉(zhuǎn)換為同一相機的坐標(biāo)系中的 3D 點云。 因此,相機可以是深度相機或彩色相機。
實現(xiàn)
該函數(shù)的結(jié)果與針對每個像素運行 k4a_calibration_2d_to_2d() 的結(jié)果相同,不過計算效率更高。 調(diào)用 k4a_transformation_create() 時,我們會預(yù)先計算一個所謂的 xy 查找表,用于存儲每個圖像像素的 x 和 y 比例因子。 調(diào)用 k4a_transformation_depth_image_to_point_cloud() 時,我們會通過將像素的 x 比例因子與像素的 Z 坐標(biāo)相乘,來獲取像素的 3D X 坐標(biāo)。 類似地,與 y 比例因子相乘可以計算出 3D Y 坐標(biāo)。 SDK 的快速點云示例 演示了如何計算 xy 表。 例如,用戶可以遵循示例代碼實現(xiàn)其自有版本的此函數(shù),以加速其 GPU 管道。
參數(shù)
輸入?yún)?shù)是轉(zhuǎn)換句柄、相機說明符和深度圖像。 如果相機說明符設(shè)置為深度,則深度圖像的分辨率必須與創(chuàng)建轉(zhuǎn)換句柄時指定的 depth_mode 相匹配。 否則,如果說明符設(shè)置為彩色相機,則分辨率必須與所選 color_resolution 的分辨率相匹配。 輸出參數(shù)是需要由用戶調(diào)用 k4a_image_create() 分配的 XYZ 圖像。 該 XYZ 圖像的分辨率必須與輸入的深度圖的分辨率相匹配。 我們將為每個像素存儲三個帶符號的 16 位坐標(biāo)值(以毫米為單位)。 因此,XYZ 圖像步幅設(shè)置為 width * 3 * sizeof(int16_t)。 數(shù)據(jù)順序為像素交錯式,即,X 坐標(biāo) – 像素 0,Y 坐標(biāo) – 像素 0,Z 坐標(biāo) – 像素 0,X 坐標(biāo) – 像素 1,依此類推。 如果無法將某個像素轉(zhuǎn)換為 3D,該函數(shù)將為該像素分配值 [0,0,0]。
示例
后續(xù)步驟
了解如何使用 Femto Bolt 3D 相機SDK 圖像轉(zhuǎn)換函數(shù)后,接下來還可以了解校準(zhǔn)函數(shù)。