KinectAzureDK編程實戰_OpenCV 2 給 Depth Map 和 IR Image 著色
- 2019 年 10 月 8 日
- 筆記
上述程式碼是該函數的應用過程。
首先,聲明一個動態數組 depthTextureBuffer,數組元素類型為自定義的數據結構 Pixel。
然後,該函數輸入數據類型為 k4a::image 的 depthImage,通過一個函數對象 ColorizeBlueToRed 按照一個範圍 GetDepthModeRange 將 depth 值 轉為 像素顏色。輸出 raw data 到 depthTextureBuffer。
最後,將該 raw buffer 直接聲明一個 cv::Mat 對象。
我們從數據結構一點點講解。
由上篇文章講解,Kinect Azure DK 的 k4a::image 對象內部的像素存儲格式和 OpenCV 的 cv::Mat 一樣。
聲明一個簡單的數據類型 Pixel,用 8 位數據表示每個色彩 channel。
Depth Map 每個像素值表示距離,IR Image 每個像素值表示亮度,都用 16 位數據表示 DepthPixel。

對於 Depth Map,使用 ColorizeBlueToRed 函數輸入 depth 值和距離閾值範圍,輸出著色的 Pixel。

這個函數將深度值按照 Kinect 對應的 深度圖模式設定遠近閾值。

Kinect 輸出的深度值單位為:mm。如上列表,對於 K4A_DEPTH_MODE_NFOV_UNBINNED 模式的深度圖,此時的深度值範圍在 500mm ~ 4000mm。在這個範圍內的深度值,「近」的趨近於藍色,「遠」的趨近於紅色。
將所有的深度值規範化為 [0, 1]。此時深度值可以直接變為 HSV 色彩空間。但是我們還需要把 HSV 色彩空間的像素值變為 RGB 色彩空間。此時我們按照
wiki: HSV to RGB http://en.wikipedia.org/wiki/HSL_and_HSV
寫出如下轉換色彩空間的函數。

對於 IR Image,處理流程類似。

不過,有幾處稍微不同。
使用 ColorizeGreyscale 函數來對 IR 亮度值著色。

直接按照明亮程度的閾值範圍,「亮」的趨近於白色,「暗」的趨近於黑色。
由函數 GetIrLevels 返回明亮程度的閾值設定,正常輸出 IR 圖時為 [0,100]。

總起來看 ColorizeDepthImage 函數。

輸入 depthImage(或者irImage),用於可視化的函數對象 visualizationFn,閾值範圍 expectedValueRange。
輸出由動態數組 std::vector<Pixel> 表示的 raw buffer。
直接將 raw buffer 輸出給 cv::Mat。

注意,cv::Mat 對象的像素類型需要設置為 CV_8UC4。