APP下载

基于机器视觉的人机交互系统的设计*

2019-08-12

关键词:感应器手势手部

涂 朴 沈 荣 黄 晨

(1. 四川文理学院智能制造学院,四川 达州 635000; 2. 四川省达州市公安局,四川 达州 635000)

0 引 言

随着人工智能和虚拟现实技术的不断发展,人机交互[1-3](human-computer interaction)系统已经成为当前的研究热点.目前,人机交互系统主要采取了行为识别[4-5](手势交互)、三维交互[6]、语音交互[7-8]、触觉交互[9-10]和多通道交互[10]等技术.

作为行为识别技术中的一个重要研究分支,机器视觉方法实时性、鲁棒性较强,具有易于实现、交互性较好等优点.如,通过捕捉目标物体的三维坐标信息,可以协助移动机器人完成目标跟踪[11]、自主导航和避障[12-13].本文也将利用机器人视觉技术,对人体图像、姿势动作进行识别和处理,以期实际应用于特种机器人、服务机器人及智能家居等领域.

1 整体设计

首先,在上位机层面,通过Kinect感应器,实时捕捉深度图像和RGB图像.然后,利用OpenNI和NITE技术框架,编写人体姿态识别处理程序(手势和人体骨骼),将用户的手部或者肢体动作在空间中的坐标位移进行分类处理.最后,将对应的操控指令通过串口驱动程序发送至单片机执行,从而实现对人体动作的识别.整个系统结构框图见图1.

图1 系统结构框图

2 深度图像和RGB图像获取

深度图像的获取是由红外线发射器和CMOS 红外摄像机共同完成的,只要Kinect感应器接收到了光编码的红外图案,其内置的PrimeSense的PS1080芯片就会把这个图案与存储在芯片内存中的参考图像相比较,经过系统校准后,就转换成了一个VGA尺寸的场景深度图像,用户通过OpenNI的API即可访问这个图像.RGB图像的获取则相对简单,通过Kinect自带的标准RGB摄像机及其数据镜像功能,即可访问RGB图像.Kinect感应器获取的深度图像和RGB图像对比如图2所示.

使用Processing语言实现获取深度图像和RGB图像的主要过程是,导入Simple-OpenNI库,声明包含Simple-OpenNI对象的Kinect变量,并启动对象中的深度图和RGB图像的数据镜像功能.

图2 深度图像和RGB图像对比图

3 手势识别和人体骨骼识别

3.1 手势识别

以用手势控制小车运动为例.用户向Kinect感应器挥手,开启识别功能:手势向左、右滑动,分别控制小车左、右转弯;上下滑动,分别控制小车前进、后退;用手势画出一个圆形,小车刹停.主要的程序流程是:(1)启用Kinect对象的深度图、手势和手部函数,用挥手手势命令Kinect开始手部跟踪;(2)设定NITE的手点控制器和圆形探测器,跟随用户手部动作,实时更新手部向量(Processing向量PVector),并在屏幕上通过坐标映射绘制手部跟踪点;(3)为了检测左右、上下挥手和画圆的动作,还要添加监听器,并且编写NITE回调函数.函数通过计算手部位置向量的数据变化来识别动作,如,本文采用的方法为监测手部位置向量的x方向位置变动,超过设定的阈值(50 mm),则认为向左(右)挥手的动作发生;(4)通过串口驱动程序,向单片机发送指令,执行相应动作.左手向左、右滑动时,识别手势过程如图3所示.

图3 识别手势图(a)左滑动识别手势图;(b)右滑动识别手势图

3.2 人体骨骼识别

Kinect感应器能够识别追踪20个主要的人体骨骼点,利用各关节点的三维坐标数据可以计算得出关节转角,实现对人体姿态的识别.进一步的,将人体姿态映射为机械臂的执行动作,就能实现机械臂模仿人体动作的控制方式.以人体右肩关节作为控制关节为例,主要的程序流程是:(1)启用Kinect对象的深度图和人体关节,注册发现新用户、丢失用户、姿势侦测等相关回调函数.当监测到设定的触发姿态后使用NITE进行骨骼校准;(2)开始跟踪人体骨骼,实时获取各个关节的向量,并存储各个关节的最新位置;(3)以右肩部位置为中点,从远端到近端方向,分别提取右肘部、右肩部、左肩部的向量(PVector对象),通过反正切函数计算三点连线所形成的角度,得到右肩关节的转动角度,然后输出相应的控制值.人体骨骼跟踪如图4所示.右侧肩关节跟踪情况如图5所示.

图4 人体骨骼跟踪识别图

图5 右侧肩关节跟踪识别图

关节角度计算函数如下:

float angle(PVector a, PVector b, PVector c) {

//使用反正切函数,求出三点连线形成的角度

float angle01=atan2(a.y - b.y, a.x - b.x);

float angle02=atan2(b.y - c.y, b.x - c.x);

float ang=angle02 - angle01;

return ang*(180/PI); }

关节角度位置更新函数如下:

void updateAngles() {

//提取每个关节的位置,并存储在一个PVector对象中

kinect.getJointPositionSkeleton(1,SimpleOpenNI.SKEL_SHOULDER,lShoulder);

kinect.getJointPositionSkeleton(1, SimpleOpenNI.SKEL_FOOT, lFoot);

….

//将关节转换成屏幕上的投影坐标

kinect.convertRealWorldToProjective(rShoulder, rShoulder);

….

//计算关节角度

angles[0]=angle(rElbow, rShoulder, lShoulder );

….

}

3.3 单片机控制系统设计

本文在底层执行机构采用了Arduino UNO单片机.PC机作为上位机在完成图像数据处理后,通过串行通信协议向Arduino发送控制命令与目标信息,Arduino接收后,通过脉冲宽度调制等方法驱动伺服电机、LED等设备执行相应动作.

4 结 论

本文利用Kinect感应器捕捉目标物体的三维坐标信息,并通过处理深度信息数据来实现非接触式、自然式的人机交互,具有易于实现、交互性较好等优点,可以广泛应用于服务机器人、智能家居、机器人教学、工业控制、体感游戏设计等领域.同时,该系统在消除扰动和深度图像中的空洞及噪声点等方面还存在空白,在空间人体姿态识别、点云分析、3D扫描打印等方面还有待深入开发,这将是下一步的努力方向.

猜你喜欢

感应器手势手部
手部皮肤软组织缺损修复的皮瓣选择
徐州市推进网格“实体化”布密风险“感应器”
牙嵌强制锁住式差速器壳端面齿感应淬火
挑战!神秘手势
V字手势的由来
微波感应器的原理和应用
发明电波感应器防止开车瞌睡
胜利的手势
皮瓣修复手部皮肤软组织缺损的临床应用
发生于手部的硬下疳一例