­

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