论文部分内容阅读
摘 要:本项目是针对于双目视觉跟踪的算法研究。首先主要介绍相关的背景以及双目视觉的概念。之后对于在项目中运用到的设备Kinect摄像头做一个介绍,对于主要实现跟踪的骨骼跟踪技术做一个阐述。再者就是介绍整个程序的原理及实现,并对整个项目的实验效果进行展示。本项目的研究也可以很好的移植到机器人的平台上,实现机器人的跟随,识别功能,使得本次的研究更具有实用性。
关键词:双目视觉,Kinect摄像头,骨骼跟踪,导航
1概述
双目视觉技术是当前计算机视觉研究的重点和热点,双目视觉对物体的感知过程主要是模仿人眼对物体的感知过程,简便可靠,具有较大的应用前景,一直以来也是受到国内外专家学者的重视。由于双目视觉技术直接模仿人眼,并且可以满足实时性要求,所以越来越广泛的运用到计算机视觉,机器人跟踪识别,车导航等领域,实现未知场景感知,空间位置定位灯功能。因此对于双目视觉的跟踪算法的研究具有十分重要的现实意义。
本项目的研究是在Windows7的系统中,利用VS2010设计出的双目视觉跟踪技术程序。这里主要是运用到了基于Kinect摄像头的骨骼跟踪技术,可以实现动态物体的跟踪。本研究的成果也可以很好地移植到机器人的平台上去实现机器人的目标跟踪。
本文中首先介绍了相关的背景,之后介绍了双目视觉技术,随后对于程序中运用到的Kinect摄像头,骨骼跟踪技术进行了介绍。之后对于具体的程序实现做了一个分析,主要是整个代码编写的原理,并着重阐述了骨骼跟踪技术的核心代码。然后是整个程序的运行效果进行一个展示,保证了程序的有效性。
2双目视觉
双目视觉(Binocular Vision)是机器视觉的一种重要形式,它是基于视差原理并利用成像设备从不同的位置获取被测物体的两幅图像,通过计算图像对应点间的位置偏差,来获取物体三维几何信息的方法。
双目视觉测量方法具有效率高、精度合适、系统结构简单、成本低等优点,非常适合于制造现场的在线、非接触产品检测和质量控制。对运动物体(包括动物和人体形体)测量中,由于图像获取是在瞬间完成的,因此视觉方法是一种更有效的测量方法。双目视觉系统是计算机视觉的关键技术之一,获取空间三维场景的距离信息也是计算机视觉研究中最基础的内容。
双目视觉的开创性工作始于上世纪的60年代中期。美国MIT的Roberts通过从数字图像中提取立方体、楔形体和棱柱体等简单规则多面体的三维结构,并对物体的形状和空间关系进行描述,把过去的简单二维图像分析推广到了复杂的三维场景,标志着视觉技术的诞生。随着研究的深入,研究的范围从边缘、角点等特征的提取,线条、平面、曲面等几何要素的分析,直到对图像明暗、纹理、运动和成像几何等进行分析,并建立起各种数据结构和推理规则。特别是上世纪80年代初,Marr首次将图像处理、心理物理学、神经生理学和临床精神病学的研究成果从信息处理的角度进行概括,创立了视觉计算理论框架。这一基本理论对视觉技术的发展产生了极大的推动作用,在这一领域已形成了从图像的获取到最终的三维场景可视表面重构的完整体系,使得视觉已成为计算机视觉中一个非常重要的分支。经过几十年来的发展,视觉在机器人视觉、航空测绘、反求工程、军事运用、医学成像和工业检测等领域中的运用越来越广。
3、Kinect摄像头
3.1相关介绍
Kinect是微软在2009年6月2日的E3大展上。正式公布的XBOX360体感周边外设。Kinect彻底颠覆了游戏的单一操作。使人机互动的理念更加彻底的展现出来。网友普遍称其中文名为“啃奶特”
它是一种3D体感摄影机(开发代号“Project Natal”),同时它导入了即时动态捕捉、影像辨识、麦克风输入、语音辨识、社群互动等功能。
玩家可以通过这项技术在游戏中开车、与其他玩家互动、通过互联网与其他Xbox玩家分享图片和信息等。
3.2原理介绍
黑色的Kinect设备如下图:基座和感应器之间有一个电动的马达,通过程序能够调整俯仰角度,在上面的感应器中有一个红外投影仪,两个摄像头,四个麦克风和一个风扇。打开外面的盖子可以看到里面的构造:这些感应器用来捕捉RGB和深度数据,面对Kinect,从左往右看。最左边是红外光源,其次是LED指示灯,再次是彩色摄像头,用来收集RGB数据,最右边是红外摄像头用来采集景深数据。彩色摄像头最大支持1280*960分辨率成像,红外摄像头最大支持640*480成像。
在感应器的下方是麦克风阵列,他包括四个不同的麦克风,一个在左边的红外发射器下面,另外3个在右边景深摄像头下面。
Kinect工作原理,摄像头起到了很大的作用,它负责捕捉人肢体的动作,然后微软的工程师就可以设计程序教它如何去识别、记忆、分析处理这些动作。Kinect摄像头可以捕捉到用户的手势动作,再把这些手势语言转换成游戏控制。具体来说,Kinect借助PrimeSense软件和摄像头侦测、捕捉用户手势动作,然后再将捕捉到的影像与本身内部存有的人体模型相对照。每一个符合内部已存人体模型的物体就会被创造成相关的骨骼模型,系统再将该模型转换成虚拟角色,该角色通过识别该人体骨骼模型的关键部位进行动作触发。在虚拟骨骼模型的帮助下,系统可识别人体的25个关键部位。此基础上加入了识别人体站立/坐姿的新技术。使用红外定位Kinect比一般的摄像头更为智能。首先,它能够发射红外线,从而对整个房间进行立体定位。摄像头则可以借助红外线来识别人体的运动。除此之外,配合着Xbox 360上的一些高端软件,便可以对人体的48个部位进行实时追踪。该设备最多可以同时对两个玩家进行实时追踪。除此之外,这款产品不仅能够通过红外线识别人体,还可以识别出完整的RGB色彩,并借助面部识别技术自动为用户登录。 4骨骼跟踪技术
骨骼追踪技术通过处理景深数据来建立人体各个关节的坐标,骨骼追踪能够确定人体的各个部分,如哪部分是手,头部,以及身体。骨骼追踪产生X,Y,Z数据来确定这些骨骼点。骨骼追踪系统采用的景深图像处理技术使用更复杂的算法如矩阵变换,机器学习及其他方式来确定骨骼点的坐标。
骨骼数据来自SkeletonStream,访问骨骼数据有事件模式和 “拉”模式两种方式。在本项目实验中我们采用基于事件的方式,因为这种方式简单,代码量少,并且是一种很普通基本的方法。KinectSensor对象有一个名为SkeletonFrameReady事件。当SkeletonStream中有新的骨骼数据产生时就会触发该事件。通过AllFramesReady事件也可以获取骨骼数据。SkeletonStream产生的每一帧数据都是一个骨骼对象集合。每一个骨骼对象包含有描述骨骼位置以及骨骼关节的数据。每一个关节有一个唯一标示符如头(head)、肩(shoulder)、肘(dlbow)等信息和3D向量数据。然后把获取到的数据通过设置画笔颜色画出来,就可以实现模拟人体骨骼跟踪的效果。
5原理及实现
本项目的程序是运行在VS2010上的C#WPF程序。下面对程序中的部分代码做一下分析。
(1)由于Kinect能够追踪到的骨骼数量是一个常量。这使得我们在整个应用程序中能够一次性的为数组分配内存。为了方便,Kinect SDK在SkeletonStream对象中定义了一个能够追踪到的骨骼个数常量FrameSkeletonArrayLength,使用这个常量可以方便的对数组进行初始化。具体的代码在程序中是这样的:
this.framesSkelete = new Skeleton[this.kinect.SkeletonStream.FrameSkeletonArrayLength];
(2)每一次骨骼数据变化的时候就会触发SensorSkeletonFrameReady事件,然后通过调用事件参数的OpenSkeletonFrame方法就能够获取当前的骨骼数据帧。后面的代码是遍历骨骼数据帧的Skeleton数组frameSkeletons,再在UI界面通过关节点将骨骼数据连接起来,用一条直线代表一根骨骼。具体代码参见下面两张截图:
截图一
截图二
(3)上述代码中在循环遍历frameSkeletons对象时,每一次处理一个骨骼,在处理之前都需要判断是否是一个追踪好的骨骼,可以使用Skeleton对象的TrackingState属性来判断,只有骨骼追踪引擎追踪到的骨骼我们才进行绘制,忽略那些不是使用者的骨骼信息即过滤掉那些TrackingState不等于SkeletonTrackingState.Tracked的骨骼数据。Kinect能够探测到6个使用者,但是同时只能够追踪到2个使用者的骨骼关节位置信息。具体代码就是两个if判断中的代码:
if (skel.TrackingState==SkeletonTrackingState.NotTracked)
if (skel.TrackingState == SkeletonTrackingState.Tracked || skel.TrackingState == SkeletonTrackingState.PositionOnly)
(4)处理骨骼数据相对简单,首先,我们根据Kinect追踪到使用者的编号,选择一种颜色笔刷。然后利用这只笔刷绘制曲线。CreateFigure方法为每一根骨骼绘制一条直线。GetJointPoint方法在绘制骨骼曲线中很关键,该方法以关节点的三维坐标作为参数,然后调用KinectSensor对象的MapSkeletonPointToDepth方法将骨骼坐标转换到深度影像坐标上去。下面的代码截图展示了CreateFigure和GetJointPoint这两个方法。
UI界面比较简单,将Grid元素作为根结点,设置背景色为白色,下面是WPF窗口代码:
6实验效果
本程序是运行在VS2010上的一个WPF程序,程序运行之后当我们人站在摄像头前时,可以通过一些肢体动作来获取摄像头的感知,摄像头捕捉到了我们的动作之后,即会在程序中画出我们人体骨骼的大致轮廓,这样就实现了我们骨骼跟踪的目的。我们本次项目的主要研究内容就是基于双目视觉的目标跟踪算法研究,通过这样一个小程序的实例,即实现了目标跟踪算法的编写,而我们整个程序也是可以运用到机器人的平台之上的,用于机器人的跟踪或是导航等等,这就使得我们整个程序更具实际意义,我们的研究也更具应用价值。
参考文献
[1] 贾云德.机器视觉[M].北京:科学出版社,2000
[2] Marr D,姚国正等译.视觉计算理论[M].北京:科学出版社,1988
[3] 潘华,郭戈.立体视觉研究的进展[J].计算机测量与控制.2004,12(12):59-76
[4] 侯志强,韩崇昭.视觉跟踪技术综述[J].自动化学报.2006,32(4):603-617
[5] Gary Bradski,Adrian Kaebler.OpenCV.北京:清华出版社.2009
关键词:双目视觉,Kinect摄像头,骨骼跟踪,导航
1概述
双目视觉技术是当前计算机视觉研究的重点和热点,双目视觉对物体的感知过程主要是模仿人眼对物体的感知过程,简便可靠,具有较大的应用前景,一直以来也是受到国内外专家学者的重视。由于双目视觉技术直接模仿人眼,并且可以满足实时性要求,所以越来越广泛的运用到计算机视觉,机器人跟踪识别,车导航等领域,实现未知场景感知,空间位置定位灯功能。因此对于双目视觉的跟踪算法的研究具有十分重要的现实意义。
本项目的研究是在Windows7的系统中,利用VS2010设计出的双目视觉跟踪技术程序。这里主要是运用到了基于Kinect摄像头的骨骼跟踪技术,可以实现动态物体的跟踪。本研究的成果也可以很好地移植到机器人的平台上去实现机器人的目标跟踪。
本文中首先介绍了相关的背景,之后介绍了双目视觉技术,随后对于程序中运用到的Kinect摄像头,骨骼跟踪技术进行了介绍。之后对于具体的程序实现做了一个分析,主要是整个代码编写的原理,并着重阐述了骨骼跟踪技术的核心代码。然后是整个程序的运行效果进行一个展示,保证了程序的有效性。
2双目视觉
双目视觉(Binocular Vision)是机器视觉的一种重要形式,它是基于视差原理并利用成像设备从不同的位置获取被测物体的两幅图像,通过计算图像对应点间的位置偏差,来获取物体三维几何信息的方法。
双目视觉测量方法具有效率高、精度合适、系统结构简单、成本低等优点,非常适合于制造现场的在线、非接触产品检测和质量控制。对运动物体(包括动物和人体形体)测量中,由于图像获取是在瞬间完成的,因此视觉方法是一种更有效的测量方法。双目视觉系统是计算机视觉的关键技术之一,获取空间三维场景的距离信息也是计算机视觉研究中最基础的内容。
双目视觉的开创性工作始于上世纪的60年代中期。美国MIT的Roberts通过从数字图像中提取立方体、楔形体和棱柱体等简单规则多面体的三维结构,并对物体的形状和空间关系进行描述,把过去的简单二维图像分析推广到了复杂的三维场景,标志着视觉技术的诞生。随着研究的深入,研究的范围从边缘、角点等特征的提取,线条、平面、曲面等几何要素的分析,直到对图像明暗、纹理、运动和成像几何等进行分析,并建立起各种数据结构和推理规则。特别是上世纪80年代初,Marr首次将图像处理、心理物理学、神经生理学和临床精神病学的研究成果从信息处理的角度进行概括,创立了视觉计算理论框架。这一基本理论对视觉技术的发展产生了极大的推动作用,在这一领域已形成了从图像的获取到最终的三维场景可视表面重构的完整体系,使得视觉已成为计算机视觉中一个非常重要的分支。经过几十年来的发展,视觉在机器人视觉、航空测绘、反求工程、军事运用、医学成像和工业检测等领域中的运用越来越广。
3、Kinect摄像头
3.1相关介绍
Kinect是微软在2009年6月2日的E3大展上。正式公布的XBOX360体感周边外设。Kinect彻底颠覆了游戏的单一操作。使人机互动的理念更加彻底的展现出来。网友普遍称其中文名为“啃奶特”
它是一种3D体感摄影机(开发代号“Project Natal”),同时它导入了即时动态捕捉、影像辨识、麦克风输入、语音辨识、社群互动等功能。
玩家可以通过这项技术在游戏中开车、与其他玩家互动、通过互联网与其他Xbox玩家分享图片和信息等。
3.2原理介绍
黑色的Kinect设备如下图:基座和感应器之间有一个电动的马达,通过程序能够调整俯仰角度,在上面的感应器中有一个红外投影仪,两个摄像头,四个麦克风和一个风扇。打开外面的盖子可以看到里面的构造:这些感应器用来捕捉RGB和深度数据,面对Kinect,从左往右看。最左边是红外光源,其次是LED指示灯,再次是彩色摄像头,用来收集RGB数据,最右边是红外摄像头用来采集景深数据。彩色摄像头最大支持1280*960分辨率成像,红外摄像头最大支持640*480成像。
在感应器的下方是麦克风阵列,他包括四个不同的麦克风,一个在左边的红外发射器下面,另外3个在右边景深摄像头下面。
Kinect工作原理,摄像头起到了很大的作用,它负责捕捉人肢体的动作,然后微软的工程师就可以设计程序教它如何去识别、记忆、分析处理这些动作。Kinect摄像头可以捕捉到用户的手势动作,再把这些手势语言转换成游戏控制。具体来说,Kinect借助PrimeSense软件和摄像头侦测、捕捉用户手势动作,然后再将捕捉到的影像与本身内部存有的人体模型相对照。每一个符合内部已存人体模型的物体就会被创造成相关的骨骼模型,系统再将该模型转换成虚拟角色,该角色通过识别该人体骨骼模型的关键部位进行动作触发。在虚拟骨骼模型的帮助下,系统可识别人体的25个关键部位。此基础上加入了识别人体站立/坐姿的新技术。使用红外定位Kinect比一般的摄像头更为智能。首先,它能够发射红外线,从而对整个房间进行立体定位。摄像头则可以借助红外线来识别人体的运动。除此之外,配合着Xbox 360上的一些高端软件,便可以对人体的48个部位进行实时追踪。该设备最多可以同时对两个玩家进行实时追踪。除此之外,这款产品不仅能够通过红外线识别人体,还可以识别出完整的RGB色彩,并借助面部识别技术自动为用户登录。 4骨骼跟踪技术
骨骼追踪技术通过处理景深数据来建立人体各个关节的坐标,骨骼追踪能够确定人体的各个部分,如哪部分是手,头部,以及身体。骨骼追踪产生X,Y,Z数据来确定这些骨骼点。骨骼追踪系统采用的景深图像处理技术使用更复杂的算法如矩阵变换,机器学习及其他方式来确定骨骼点的坐标。
骨骼数据来自SkeletonStream,访问骨骼数据有事件模式和 “拉”模式两种方式。在本项目实验中我们采用基于事件的方式,因为这种方式简单,代码量少,并且是一种很普通基本的方法。KinectSensor对象有一个名为SkeletonFrameReady事件。当SkeletonStream中有新的骨骼数据产生时就会触发该事件。通过AllFramesReady事件也可以获取骨骼数据。SkeletonStream产生的每一帧数据都是一个骨骼对象集合。每一个骨骼对象包含有描述骨骼位置以及骨骼关节的数据。每一个关节有一个唯一标示符如头(head)、肩(shoulder)、肘(dlbow)等信息和3D向量数据。然后把获取到的数据通过设置画笔颜色画出来,就可以实现模拟人体骨骼跟踪的效果。
5原理及实现
本项目的程序是运行在VS2010上的C#WPF程序。下面对程序中的部分代码做一下分析。
(1)由于Kinect能够追踪到的骨骼数量是一个常量。这使得我们在整个应用程序中能够一次性的为数组分配内存。为了方便,Kinect SDK在SkeletonStream对象中定义了一个能够追踪到的骨骼个数常量FrameSkeletonArrayLength,使用这个常量可以方便的对数组进行初始化。具体的代码在程序中是这样的:
this.framesSkelete = new Skeleton[this.kinect.SkeletonStream.FrameSkeletonArrayLength];
(2)每一次骨骼数据变化的时候就会触发SensorSkeletonFrameReady事件,然后通过调用事件参数的OpenSkeletonFrame方法就能够获取当前的骨骼数据帧。后面的代码是遍历骨骼数据帧的Skeleton数组frameSkeletons,再在UI界面通过关节点将骨骼数据连接起来,用一条直线代表一根骨骼。具体代码参见下面两张截图:
截图一
截图二
(3)上述代码中在循环遍历frameSkeletons对象时,每一次处理一个骨骼,在处理之前都需要判断是否是一个追踪好的骨骼,可以使用Skeleton对象的TrackingState属性来判断,只有骨骼追踪引擎追踪到的骨骼我们才进行绘制,忽略那些不是使用者的骨骼信息即过滤掉那些TrackingState不等于SkeletonTrackingState.Tracked的骨骼数据。Kinect能够探测到6个使用者,但是同时只能够追踪到2个使用者的骨骼关节位置信息。具体代码就是两个if判断中的代码:
if (skel.TrackingState==SkeletonTrackingState.NotTracked)
if (skel.TrackingState == SkeletonTrackingState.Tracked || skel.TrackingState == SkeletonTrackingState.PositionOnly)
(4)处理骨骼数据相对简单,首先,我们根据Kinect追踪到使用者的编号,选择一种颜色笔刷。然后利用这只笔刷绘制曲线。CreateFigure方法为每一根骨骼绘制一条直线。GetJointPoint方法在绘制骨骼曲线中很关键,该方法以关节点的三维坐标作为参数,然后调用KinectSensor对象的MapSkeletonPointToDepth方法将骨骼坐标转换到深度影像坐标上去。下面的代码截图展示了CreateFigure和GetJointPoint这两个方法。
UI界面比较简单,将Grid元素作为根结点,设置背景色为白色,下面是WPF窗口代码:
6实验效果
本程序是运行在VS2010上的一个WPF程序,程序运行之后当我们人站在摄像头前时,可以通过一些肢体动作来获取摄像头的感知,摄像头捕捉到了我们的动作之后,即会在程序中画出我们人体骨骼的大致轮廓,这样就实现了我们骨骼跟踪的目的。我们本次项目的主要研究内容就是基于双目视觉的目标跟踪算法研究,通过这样一个小程序的实例,即实现了目标跟踪算法的编写,而我们整个程序也是可以运用到机器人的平台之上的,用于机器人的跟踪或是导航等等,这就使得我们整个程序更具实际意义,我们的研究也更具应用价值。
参考文献
[1] 贾云德.机器视觉[M].北京:科学出版社,2000
[2] Marr D,姚国正等译.视觉计算理论[M].北京:科学出版社,1988
[3] 潘华,郭戈.立体视觉研究的进展[J].计算机测量与控制.2004,12(12):59-76
[4] 侯志强,韩崇昭.视觉跟踪技术综述[J].自动化学报.2006,32(4):603-617
[5] Gary Bradski,Adrian Kaebler.OpenCV.北京:清华出版社.2009