近期有一个项目用到了Azure Kinect,之前Kinect 1与Kinect 2均使用过的老用户,自然不能放过这个机会。为此专门对Azure Kinect进行了学习,以下是这次自己调研摸索的一些成果

Azure Kinect简介

在芯片顶级会议 ISSCC 2018微软亮相自家的一百万像素的 ToF传感器,与此在论文发表三个月后,小型化的 Kinect for Azure (K4A)工业用开发套件已经备货准备向消费者售卖。司唯方作者在19年10月即对Azure Kinect DK 基本开发流程做了详细的介绍
在这里插入图片描述

3D视觉系统

在这里插入图片描述

_据官网数据手册的 3D视觉指标:_环境照度范围要求 10..2500 lux

img

" class="reference-link">空间麦克风阵列在这里插入图片描述

在这里插入图片描述

3D姿态感知

在这里插入图片描述
以上对三维环境的(视觉、听觉、姿态)感知能力媲美甚至超过人类,对相关的边缘感知及自动化、工业智能开发人员应当是利器!同时Azure Kinect DK可以多台一起协作。
在这里插入图片描述
在这里插入图片描述
Azure Kinect DK打包了各种传感器:ToF深感相机,广角彩色相机,360度麦克风阵列,还有陀螺仪和加速度传感器等,然后通过便于使用的接口供开发者使用。其在三维建图、计算机视觉,语音识别方面拥有很高的价值。

初始配置

硬件供电

在这里插入图片描述

  1. 将电源连接器插入设备背面的电源插孔。 将 USB 电源适配器连接到线缆的另一端,然后将其插入电源插座。
  2. 将 USB数据线的一端连接到设备,将另一端连接到电脑上的 USB 3.0 端口。
  3. 检查 USB 线缆旁边的电源 LED 指示灯是否稳定点亮白色。
  4. 设备通电需要几秒钟时间。 当正面的流 LED 指示灯熄灭时,表示设备可供使用。

系统安装

• Windows 10 2018 年 4 月版 (x64) 或更高版本
• 装有 OpenGLv4.4 或更高版本 GPU 驱动程序的 Linux Ubuntu 18.04 (x64)

驱动安装

由于K4A是支持3D渲染和运算的,所以我们要预先遵照提示安装 CUDA 10.0 和所有修补程序。
在这里插入图片描述
如果使用“快速”选项安装失败,请选择“自定义”安装选项并单击“下一步”。 然后展开“CUDA”标记,并取消选择“Visual Studio 集成”。
在这里插入图片描述
cuDNN v7.5.x for CUDA 10.0:登录到 NVIDIA 开发人员网站,并下载 cudnn64_7.dll。 确保将 DLL 路径添加到“环境变量 - 路径”:

  1. 启动“控制面板”-> 选择“系统和安全性”->“系统”->“高级系统设置”
    在这里插入图片描述
  2. 选择“环境变量”-> 双击“系统变量”块下的“路径”变量 -> 确保存在包含 cudnn64_7.dll 的路径。
    在这里插入图片描述

    SDK下载

  3. 选择合适的Azure SDK 版本(本文使用的代码使用的是1.4.1的Azure Kinect SDK)
  4. 选择下载合适的人体跟踪SDK版本(本文使用的代码暂不支持1.1.0的人体跟踪SDK)
  5. 默认路径安装这两个SDK,并启动 Azure Kinect 人体跟踪查看器来检查是否已正确设置人体跟踪 SDK。可以在安装路径中的 \tools\k4abt_simple_3d_viewer.exe 中找到它。
    在这里插入图片描述

    代码分析

    关节坐标

    每个关节的位置和方向构成了其自身的关节坐标系。 所有关节坐标系是相对于深度相机 3D 坐标系的绝对坐标系。关节坐标位于轴方向。 轴方向广泛用于商业头像、游戏引擎和渲染软件。 使用轴方向可以简化镜像运动,例如将双臂抬起 20 度。
    在这里插入图片描述

    关节层次结构

    骨架包括 32 个关节,关节层次结构按照从人体中心向四肢的流向分布。 每个连接(骨骼)将父关节与子关节链接起来。 该图演示了关节位置以及相对于人体的连接。
    在这里插入图片描述
    下表列举了标准的关节连接:
索引 关节名称 父关节
0 PELVIS -
1 SPINE_NAVAL PELVIS
2 SPINE_CHEST SPINE_NAVAL
3 NECK SPINE_CHEST
4 CLAVICLE_LEFT SPINE_CHEST
5 SHOULDER_LEFT CLAVICLE_LEFT
6 ELBOW_LEFT SHOULDER_LEFT
7 WRIST_LEFT ELBOW_LEFT
8 HAND_LEFT WRIST_LEFT
9 HANDTIP_LEFT HAND_LEFT
10 THUMB_LEFT WRIST_LEFT
11 CLAVICLE_RIGHT SPINE_CHEST
12 SHOULDER_RIGHT CLAVICLE_RIGHT
13 ELBOW_RIGHT SHOULDER_RIGHT
14 WRIST_RIGHT ELBOW_RIGHT
15 HAND_RIGHT WRIST_RIGHT
16 HANDTIP_RIGHT HAND_RIGHT
17 THUMB_RIGHT WRIST_RIGHT
18 HIP_LEFT PELVIS
19 KNEE_LEFT HIP_LEFT
20 ANKLE_LEFT KNEE_LEFT
21 FOOT_LEFT ANKLE_LEFT
22 HIP_RIGHT PELVIS
23 KNEE_RIGHT HIP_RIGHT
24 ANKLE_RIGHT KNEE_RIGHT
25 FOOT_RIGHT ANKLE_RIGHT
26 HEAD NECK
27 NOSE HEAD
28 EYE_LEFT HEAD
29 EAR_LEFT HEAD
30 EYE_RIGHT HEAD
31 EAR_RIGHT HEAD

代码阐述

本文使用了python来搭建了构建了一个人体识别跟踪进阶框架


import sys
sys.path.insert(1, '../pyKinectAzure/')

import numpy as np
from pyKinectAzure import pyKinectAzure, _k4a
from kinectBodyTracker import kinectBodyTracker, _k4abt
import cv2

# Azure Kinect SDK的k4a.dll和k4abt.dll的路径
modulePath = 'C:\\Program Files\\Azure Kinect SDK v1.4.1\\sdk\\windows-desktop\\amd64\\release\\bin\\k4a.dll' 
bodyTrackingModulePath = 'C:\\Program Files\\Azure Kinect Body Tracking SDK\\sdk\\windows-desktop\\amd64\\release\\bin\\k4abt.dll'
# under x86_64 linux please use r'/usr/lib/x86_64-linux-gnu/libk4a.so'
# In Jetson please use r'/usr/lib/aarch64-linux-gnu/libk4a.so'

if __name__ == "__main__":

    # 使用包含模块的路径初始化库
    pyK4A = pyKinectAzure(modulePath)

    # 打开设备
    pyK4A.device_open()

    # 修改相机参数
    device_config = pyK4A.config
    device_config.color_resolution = _k4a.K4A_COLOR_RESOLUTION_OFF
    device_config.depth_mode = _k4a.K4A_DEPTH_MODE_NFOV_UNBINNED
    print(device_config)

    # 使用修改的配置启动摄像头
    pyK4A.device_start_cameras(device_config)

    # 初始化身体跟踪器
    pyK4A.bodyTracker_start(bodyTrackingModulePath)

    k = 0
    while True:
        # 获取捕获
        pyK4A.device_get_capture()

        # 从捕获中获取深度图像
        depth_image_handle = pyK4A.capture_get_depth_image()


        # 检查图像是否正确读取
        if depth_image_handle:

            # 是否存在人体
            pyK4A.bodyTracker_update()

            # 读取图像数据并将其转换为numpy数组
            depth_image = pyK4A.image_convert_to_numpy(depth_image_handle)
            depth_color_image = cv2.convertScaleAbs (depth_image, alpha=0.05)  #alpha通过与Azure k4aviewer结果的视觉比较进行拟合
            depth_color_image = cv2.cvtColor(depth_color_image, cv2.COLOR_GRAY2RGB) 

            # 获取人体分割图像
            body_image_color = pyK4A.bodyTracker_get_body_segmentation()

            combined_image = cv2.addWeighted(depth_color_image, 0.8, body_image_color, 0.2, 0)

            # 画人体骨架
            for body in pyK4A.body_tracker.bodiesNow:
                skeleton2D = pyK4A.bodyTracker_project_skeleton(body.skeleton)
                State_Judgement(skeleton2D)
                combined_image = pyK4A.body_tracker.draw2DSkeleton(skeleton2D, body.id, combined_image)

            # 基于深度图像的覆盖体分割
            cv2.imshow('Segmented Depth Image',combined_image)
            k = cv2.waitKey(1)

            # 释放图像
            pyK4A.image_release(depth_image_handle)
            pyK4A.image_release(pyK4A.body_tracker.segmented_body_img)

        pyK4A.capture_release()
        pyK4A.body_tracker.release_frame()

        if k==27:    # 按Esc键停止
            break
        elif k == ord('q'):
            cv2.imwrite('outputImage.jpg',combined_image)

    def State_Judgement(skeleton2D):#预留接口,方便后续开发
        skeleton_size = size(skeleton2D.joints2D)
        skeleton_list = np.zeros((3,skeleton_size), dtype=np.float32)
        for i in range(skeleton_size):
            skeleton_list[0][i] = skeleton2D.joints2D[i].position.xy.x
            skeleton_list[1][i] = skeleton2D.joints2D[i].position.xy.y
            skeleton_list[2][i] = skeleton2D.joints2D[i].confidence_level

    pyK4A.device_stop_cameras()
    pyK4A.device_close()

我们使用的库参考了github上的函数库,并对其代码进行了一定程度的测试和编写,最终得到下图。我们可以看到这一代的Kinect效果相较于上两代效果有了飞速的提升,非常适用于科研开发、商业应用等用途
在这里插入图片描述