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