KinectAzureDK編程實戰_OpenCV 2 給 Depth Map 和 IR Image 著色

  • 2019 年 10 月 8 日
  • 筆記

上篇文章,我們詳細講了如何用 OpenCV 顯示 Kinect 的 raw data。其中,重點講了從打開 Kinect 、顯示、關閉 Kinect 的流程。有一個很重要的函數 ColorizeDepthImage 用來將無法可視化的 Depth Map 和 IR Image 轉換為 OpenCV Mat 的 raw buffer。

上述程式碼是該函數的應用過程。

首先,聲明一個動態數組 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