近期有一个项目用到了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
” class=”reference-link”>空间麦克风阵列
3D姿态感知
以上对三维环境的(视觉、听觉、姿态)感知能力媲美甚至超过人类,对相关的边缘感知及自动化、工业智能开发人员应当是利器!同时Azure Kinect DK可以多台一起协作。
Azure Kinect DK打包了各种传感器:ToF深感相机,广角彩色相机,360度麦克风阵列,还有陀螺仪和加速度传感器等,然后通过便于使用的接口供开发者使用。其在三维建图、计算机视觉,语音识别方面拥有很高的价值。
初始配置
硬件供电
- 将电源连接器插入设备背面的电源插孔。 将 USB 电源适配器连接到线缆的另一端,然后将其插入电源插座。
- 将 USB数据线的一端连接到设备,将另一端连接到电脑上的 USB 3.0 端口。
- 检查 USB 线缆旁边的电源 LED 指示灯是否稳定点亮白色。
- 设备通电需要几秒钟时间。 当正面的流 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 路径添加到“环境变量 – 路径”:
- 启动“控制面板”-> 选择“系统和安全性”->“系统”->“高级系统设置”
- 选择“环境变量”-> 双击“系统变量”块下的“路径”变量 -> 确保存在包含 cudnn64_7.dll 的路径。
SDK下载
- 选择合适的Azure SDK 版本(本文使用的代码使用的是1.4.1的Azure Kinect SDK)
- 选择下载合适的人体跟踪SDK版本(本文使用的代码暂不支持1.1.0的人体跟踪SDK)
- 默认路径安装这两个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效果相较于上两代效果有了飞速的提升,非常适用于科研开发、商业应用等用途