【基于kinect的人体识别技术的一些改进】 人体动作识别 kinect
摘要:kinect工作模式的核心是人体识别,该文研究了kinect人体识别的实现过程,并对Microsoft SDK提供的代码作了改进。 关键词:人体识别;深度识别;骨骼追踪
中图分类号:TP391文献标识码:A文章编号:1009-3044(2012)21-5220-04
Kinect based Human Identification Technology Improvement
LIN Tian-feng, YANG Jie-xia
(Guangzhou University, Guangzhou 510006, China)
Abstract: In the kinect game, the most important link is the identification of body, This article uses the Microsoft SDK development of hu man identification system to do specific research and implementation.
Key words: the identification of body;deep identification; on the track of the bones
kinect是微软在2010年6月14日推出,能用于Xbox360的游戏机设备。通过kinect,玩家可以利用肢体或者声音去操作各样的物品,开创了一种新的游戏模式,使得游戏与运动相结合。这种新的游戏模式展现了人机交互的理念,添加了游戏乐趣,将会是游戏一个新的里程碑。
kinect的工作模式主要是识别人体及相关的动作,而识别人体的最主要核心就是骨骼。通过骨骼的追踪,kinect把人体的动作扫描到计算机上,并做相关的模拟及操作。原Microsoft SDK提供的代码,下部分没有连接到脊椎,脚部在系统识别时,脚部线条偶尔会出现识别出错的现象,该文研究了kinect人体识别的实现过程,对此作了改进。
1 kinect技术及工作原理
Kinect主要包括三个方面,kinect传感器、深度识别技术和人体骨骼追踪技术。
1.1 kinect传感器
kinect有三个摄像头,中间是RGB彩色摄像头,两边是红外线发射器和CMOS摄像机,分别用于发射红外线和接受数据。其工作过程是通过CMOS红外传感器来感知摄像头前面的环境,使用黑白光谱的方式来判断前面对应的物品与传感器的物理距离,收集摄像头视野里的每一点,然后每30MS整合出一幅深度图像,并且用3D的效果模型显示出来。
1.2深度识别技术
kinect在生成的深度图像上,采用分隔策略,将人体从深度图像中的背景环境中区分出来,进行像素级评估,辨别出人体的不同部位,同时返回深度图像到设备上。采用3D深度摄像机技术,可以捕捉到人所在的空间位置。原理是红外线感应,Kinect上有1组3D深度感应摄像头,首先通过红外线发射器发出一种不可见镭射光,这个光线经过扩散片分布在测量的空间内,当镭射光射到人体之后会形成反射斑点,另外一个红外线摄像机对这些反射斑点进行记录,通过芯片合成出3D深度信息的图像。
1.3人体骨骼追踪技术
识别到3D图像深度信息后,kinect通过渲染数据,并计算得到人体主要的20个骨骼位置,通过kinect红外扫描,计算机程序计算并掌握玩家身形轮廓与其肢体位置,以此来判断玩家的姿势,从而捕捉到人的动作,现在kinect由于视野和识别的效果情况下,最佳状态支持2个人的骨骼捕捉。通过kinect的深度图像,根据系统某像素,来判定人体的20个节点,生成骨骼系统,以实现对人体的识别功能。
2 kinect的人体识别技术的实现与改进
2.1彩色图像显示
彩色图像是kinect所摄影到的真实场景图像,在设备初始化完成后,系统通过线程来实现对彩色图像的加工以及将其显示到彩色控件上,初始化彩色图像的数据,绑定数据流,提取数据流,读取当前帧的数据,将数据以位图形式显示到控件上,最后释放当前帧,等待下一帧的数据,并重复以上的操作。
2.2深度图像数据处理
当设备初始化完毕,系统通过轮询的模式,来读取深度图像数据,并处理数据,通过使用NuiImageStreamOpen()函数打开数据流,获取当前帧的数据,并且指出下一帧数据的等待时间,如果有新的数据帧到来,或者超过等待时间,函数返回。当函数成功返回时,则程序处理数据,创建一个深度数据处理的线程,在线程中调用CSkeletalViewerApp:Nui_GotDepthAlert()来加工深度数据,在Nui_GotDepthAlert()中,调用NuiImageStreamGetNextFrame()获取当前帧的深度图像数据,其次Nui_GotDepthAlert()返回框架锁防止底层数据的变化,最后调用DrawDevice类中定义的DrawFrame()函数来缓冲数据,并把数据处理后显示在应用上。深度图像控件实现如图1所示。
图1深度图像控件实现图
2.3生成骨骼图
骨骼架构。
骨骼图生成是本应用的重点,在此应用中,生成的骨骼图,是由数据渲染出的点和线条构成的骨骼架构图。当系统检测追踪到的人体时,先生成深度图,再通过dwFrameNumber成员变量NUI_SKELETON_FRAME结构所包含了对于深度图像的帧处理,创造骨骼框架,骨骼的API消息处理每一个深度事件消息,以便应用程序处理数据。接收骨骼数据存储在SDK的一个数据结构中,如下:
typedef struct _NUI_SKELETON_DATA
{
NUI_SKELETON_TRACKING_STATE eTrackingState; DWORD dwTrackingID;
