本文由官方文档翻译而来php
OpenNI 2.0 API(应用程序编程接口)提供了访问PrimerSense的兼容深度传感器。这就使得一个应用程序可以初始化传感器和从设备接收深度(depth),彩图(RGB)和红外(IR)视频流,还提供了一个统一的接口给传感器和经过深度传感器建立.oni记录文件。css
OpenNI也提供了第三方中间件开发者能够相互使用深度传感器的统一接口。应用程序还能用第三方中间件(如NITE2),也可使用直接由OpenNI提供的基础的深度和视频数据。html
获取深度视频流须要使用4个主要的类(class)。mysql
1. openni::OpenNI提供了一个静态的API进入点。它提供访问设备,设备相关事件,版本和错误信息。固然,首先得确保你链接了设备。linux
2. openni::Device提供了一个传感器设备链接系统的接口(我的理解就是经过Device类来访问控制传感器)。在它建立以前须要对OpenNI类进行初始化。Device能够访问流(Streams)。程序员
3. openni::VideoStream从一个设备(Device)里提取一个视频流,须要获取视频帧引用(VideoFrameRefs)。redis
4. openni::VideoFramRef从相关的源数据里提取一个视频帧。这是从一个特定的流里面获取的。算法
除了这些主要的类之外,还有许多类和结构体用来保持一些特殊类型的数据。Rocorder类就是用来存储OpenNI视频流到文件的。还有Listener类用来监听OpenNI和Stream类产生的事件。sql
视频流能够经过两种方式来获取数据:轮询和事件。下面会有具体介绍。数据库
首先是最主要组成OpenNI2的是openni::OpenNI,这个类提供了一个API的静态入口。可用来访问系统中全部的设备(传感器设备)。也能够生成许多设备链接和断开事件,和提供以轮询方式访问数据流的功能同样。
OpenNI类提供了API的静态入口,是在OpenNI::initialize()方法。这个方法初始化全部的传感器驱动而且扫描系统中全部可用的传感器设备。全部使用OpenNI的应用程序在使用其余API以前都应该调用此方法。
一旦初始化方法完成,将可能会设备(Device)对象,并使用这些对象来和真实的传感器硬件进行交互。OpenNI::enumerateDevices()方法会返回一个已经链接上系统的可用的传感器设备列表。
当应用程序准备退出时,必须调用OpenNI::shutdown()方法来关闭全部驱动而且正确地清除全部。
流的轮询访问系统是OpenNI::waitForStream()方法实现的。此方法的参数之一就是流的列表。当方法调用时,就会锁定直到列表中的流有新的可用数据。而后返回一个状态码(status code)并指向是哪一个流有可用数据了。
OpenNI类提供了一个在事件驱动方式(event driven manner)中访问设备的框架。OpenNI定义了3个事件:设备链接事件(onDeviceConnected),设备断开事件(onDeviceDisconnected),设备状态改变事件(onDeviceStateChanged)。设备链接事件是在一个新的设备链接并经过OpenNI可用时产生的,设备断开事件是在一个设备从系统中移除时产生的。设备状态改变事件是在设备的设置被改变时产生的。
能够用下列方法从事件处理列表中增添或者移除监听器类(Listener classes):
OpenNI::addDeviceConnectedListener()//添加设备链接事件监听器
OpenNI::addDeviceDisconnectedListener()//添加设备断开事件监听器
OpenNI::addDeviceStateChangedListener()//添加设备状态改变事件监听器
OpenNI::removeDeviceConnectedListener()//移除设备链接事件监听器
OpenNI::removeDeviceDisconnectedListener()//移除设备断开事件监听器
OpenNI::removeDeviceStateChangedListener()//移除设备状态改变事件监听器
3个事件都提供了一个指针指向OpenNI::DeviceInfo对象。这个对象用来获取被事件提交的设备的细节和标识。此外,设备状态改变事件还提供了一个指针指向DeviceState对象,这个对象被用来查看设备新的状态信息。
事件驱动经过视频流类(VideoStream class)来访问真实的视频流
在SDK中有许多方法都会返回一个类型为“Status”的值。当错误发生,Status就会包含有一个记录或者显示给用户的代码。OpenNI::getExtendedError()方法会返回更多的关于错误的可读信息。
API的版本信息由OpenNI::getVersion()方法来获取。这个方法返回应用程序目前使用的API的版本信息。
openni::Device类提供了一个物理硬件设备的接口(经过驱动)。也经过一个从物理设备得来的ONI记录文件提供了一个模拟硬件设备的接口。
设备的基本目的是提供流。设备对象被用来链接和配置底层文件或者硬件设备,并从设备中建立流。
注意:这里设备对象是和一整个设备(好比一台kinect或者一台xtion)联系的,而不是具体到某个传感器。
在设备类能链接到物理硬件设备前,设备必须在物理上正确地链接到主机,而且驱动必须安装完毕。OpenNI2自带PrimeSense传感器驱动。
若是链接的是ONI文件,那要求在系统运行应用程序时ONI记录文件必须可用,并且应用程序有足够的权限去访问。
固然,也须要在联系设备前openni::OpenNI::initialize()方法被调用。这将会初始化驱动,使API知道设备链接了。
设备类(Device class)的构造函数没有参数,也不会联系到物理硬件设备。只是简单地建立对象。
此方法用来联系到物理硬件设备。open()方法有一个参数,设备的URI(统一资源标识符),方法返回一个状态码指示是否成功。
最简单的用法是用常量openni::ANY_DEVICE做为设备的URI,用这个常量会使系统链接全部的硬件设备。当刚好只有一个设备已链接,这招就会很是有用。
若是多个传感器链接了,那就得先调用OpenNI::enumerateDevices()来获取可用的设备列表。而后找到你要找的设备,经过调用DeviceInfo::getUri()来获取URI,用此方法的输出做为Device::open()的参数,而后就能打开对应的设备了。
若是打开文件,那参数就是ONI文件的路径。
close()方法用来关闭硬件设备。按照惯例,全部打开的设备必需要关闭。这会分离硬件设备和驱动,这样后面的应用程序链接它们就不会有什么麻烦了。
isValid()方法用来肯定设备是否正确地和设备对象联系到了
能够获取关于设备的基础信息。信息包括名称,供应商,uri,USB VID/PID(usb的id有两部分,供应商id即VID,产品id即PID)。openni::DeviceInfo类就提供了相关信息。每一个可用信息都有getter方法,从给定的设备对象里获取DeviceInfo就调用Device::getDeviceInfo()方法
一个设备可能由许多传感器组成。好比一个PrimeSense设备就由IR(红外)传感器,一个color(颜色)传感器和一个depth(深度)传感器组成。流的打开必须基于已经有的传感器。也就是说有什么传感器你才能打开什么流
能够从一个设备中获得传感器列表。Device::hasSensor()方法用来查询设备是否有特定的传感器。传感器类型以下:
SENSOR_IR – The IR video sensor 红外视频传感器
SENSOR_COLOR – The RGB-Color video sensor 彩色视频传感器
SENSOR_DEPTH – The depth video sensor 深度视频传感器
若是要找的传感器可用,Device::getSensorInfo()方法就能够用来获取其信息。SensorInfo提供了传感器类型,包含了视频模式的数组的getter方法。个别视频模式被封装进了VideoMode类。
特殊设备功能
一些设备会同时产生深度流和彩图流。一般这些流由不一样的物理摄像头来生成。然而它们在实际上的位置是不一样,就形成了它们生成的同一画面是从不一样角度得来的。这就使得从同一设备对象不一样的流获得的图像有所不一样。
两个摄像头之间的几何关系和距离对于设备对象来讲都是已知的。这就能够经过数学上的变换来使得两幅图像可以一致。让一个叠加在另外一个上。好比彩图的每一个像素叠加到深度图上。这个过程就是配准(每个像素配准叠加到另外一张图上)
一些设备可以在硬件进行运算,那么能够校准数据。若是这个功能可用,那硬件上有个标示flag来进行开或关。
设备对象提供了isImageRegistrationSupported()方法来测试已链接的设备是否支持配准功能。若是支持,那getImageRegistrationMode()能用来查询这个功能的状态,setImageRegistrationMode()就能够设置它。openni::ImageRegistrationMode枚举提供了如下值用来set或get:
IMAGE_REGISTRATION_OFF – Hardware registration features aredisabled 硬件配准功能被禁用
IMAGE_REGISTRATION_DEPTH_TO_IMAGE – The depth image is transformed tohave the same apparent vantage point as the RGB image 深度图像被变换叠加至彩图上
须要注意的是两个传感器的可视范围有部分不重叠。这就致使部分深度图不会在显示在结果中。在深度图有毛边的地方的能够看到“影子”或者“孔洞”,因为距离摄像头距离的不一样而看起来不一样数量的物体被“转移变形(shifted)”了。致使远的物体移动大过近的物体。而它们之间留下了一个没有可用的深度信息的空间。(这一段我也有点迷糊了...)
当深度和彩图流均可用,那可能两个流会出现不一样步,会致使轻微的帧率不一样,或者是帧到达时间的轻微不一样,即便是帧率相同时。
一些设备提供了使两个帧同步的功能,为了在肯定的最大时间范围内分别从获取到两个帧,一般这个最大值都小于两帧间隔。这个功能就是帧同步。
启用或禁用此功能用setDepthColorSyncEnable()。
一些设备有功能设置不一样于帧同步和配准。OpenNI 2.0提供了setProperty()和getProperty()方法来激活这些功能。setProperty方法用一个属性Id和值来设置它。getProperty方法则返回对应Id的属性的值。
查阅传感器供应商对于特殊附加属性的支持,及对应数字id和属性的值。
文件设备(File Devices)
OpenNI 2.0 提供了记录设备输出到文件的功能(记录文件是ONI文件,一般扩展名为.oni)。能够选择记录设备里的全部的流,在录像时保证设置都为使能。一旦录像开始,那么录像就能够做为“文件设备”打开。
打开文件设备和打开设备差很少,都是调用Device::open(),只不过文件设备是用文件路径做为URI。
这个功能在运行调试时很是有用。实时场景很难甚至不能再现,而经过录像功能,就使得同一输入可以用于多个算法,调试,性能比较。此功能能用于应用的自动化测试,或者是在一个项目中摄像头不足,测试代码就能够用记录文件来替代。最后,录像还可使得技术支持经过查看用户摄像头的输出文件找出问题实现远程支持。
重放控制类(PlaybackControl class)用于访问文件设备的特殊功能。查看关于此类的章节获取更多信息。为了促进写出通用目的的处理文件和设备的代码,OpenNI提供了Device::isFile()方法,容许应用在尝试使用重放控制以前肯定是文件仍是设备。
在处理记录文件(recorded file)时可能会有一系列操做。这些操做包括在流里查找,肯定记录有多长,循环播放,改变重放速度。这个功能封装在PlaybackControl类中。
在使用PlaybackControl类以前,必须实例化和从文件初始化一个Device类。一旦一个可用的文件设备被建立,你就能够经过调用Device::getPlaybackControl()得到其中的PlaybackControl对象。Device::IsFile()方法被用来肯定一个Device是否从一个文件建立的。
提供了两个方法从一个记录中查找定位
PlaybackControl::seek()方法用一个视频流指针(VideoStream pointer)和帧ID(frameID)做为输入,而后重放到指定的帧。若是一个记录中有多个流,那全部的流都会被设置到一样的位置上(定位的位置是指定流指定帧ID的位置)。
PlaybackControl::getNumberOfFrames()方法用来肯定这个记录有多长。从根本上肯定可用目标来查找颇有用。此方法以一个流的指针做为输入,返回指定流所包含的帧的数目。须要注意的是同一记录的不一样流可能不一样的帧总数。由于真不会一直都同步。
此功能在测试一个有很大输入数据集合的算法时颇有效。由于能够更快地获得结果。
PlaybackControl::setSpeed()方法使用一个浮点数做为输入。这个输入值做用于记录制做的多种速度。好比记录是一个30fps的流,而后输入值为2.0,那么重放速度为60fps,若是输入值为0.5,那重放速度为15fps。
设置速度为0.0会致使流播放速度为极限速度(系统能运行的最大速度)。设置速度为-1会致使流变成手动读取,即播放会暂停,卡在这一帧,直到应用程序去去读取下一帧。将记录置为手动模式(manual mode),读取将会很紧密地循环,这就和设置速度为0.0很像。设置速度0.0是由于在用事件驱动模式进行数据读取时颇有用。
PlaybackControl::getSpeed()方法会返回最近设置的速度值。
一个物理传感器会继续产生数据没法肯定,而记录又只有必定数量的帧。这时用一个记录来模拟一个物理传感器就会有问题,应用程序的代码设计是用来处理物理传感器,所以不能拿来处理记录的结束。
为了解决这个问题,API提供了一个循环播放的方法。PlaybackControl::setRepeatEnabled()方法用来开关循环。设置值为true则重复读取,读完最后一帧又读第一帧。若是设置值为false,那么在记录读取完后致使没有数据帧了。
PlaybackControl::getRepeatEnable()可用来获取当前的重复(repeat)值。
由设备类建立的视频流类封装了全部的数据流。这就使得你能够对数据流进行开始,中止,和配置。也被用来进行流一级(和设备一级相对)的参数配置。
调用视频流默认的构造函数会建立一个空的未初始化的视频流对象。在使用前,这个对象必须调用VideoStream::create()进行初始化。而create()方法要求一个已经初始化的设备对象。一旦建立,你就能够调用VideoStream::start()方法来产生数据流。VideoStream::stop()方法则会中止产生数据流。
一旦视频流建立完毕,就能够直接经过VideoStream::readFrame()方法进行读取数据。若是有新的可用数据了,这个方法就会返回一个能够访问由视频流生成的最新的视频帧引用(VideoFrameRef)。若是没有新的帧可用,那就会锁定直到有新的帧可用。
须要注意的是,若是非循环地从记录中读取,那么在追后一帧读取完毕后程序将永远卡死在此方法。
在事件驱动方式下(event driven manner)从视频流中读取数据是能够的。首先,须要建立一个类继承自VideoStream::Listener类,此类应该实现方法onNewFrame()。一旦你建立了这个类,实例化了它,就能够经过VideoStream::addListener()方法来添加监听器。当有新的帧到达,自定义的监听器类的onNewFrame()方法就被调用。而后你就能够调用readFrame()读取了。
传感器信息和视频模式类能够一直追踪视频流的信息。视频模式封装了视频流的帧率(frame rate),分辨率(resolution)和像素格式(pixel format)。传感器信息包含了产生视频流的传感器的类型和每一个流的视频模式对象列表。经过遍历这个列表,那就能肯定传感器生成的流的全部可能的模式。
使用VideoStream::getSensorInfo可以获得当前流的传感器信息对象
此功能为肯定建立了视频流的传感器的视野范围。使用getHorizonFieldOfView()和getVerticalFieldOfView()方法来肯定视野。其返回的值是弧度。
在深度流中,一般知道一个像素可能出现的最大值和最小值是颇有用的。用getMinPixelValue()和getMaxPixleValue()方法就能获取这些信息。
能够设置给定流的帧率(frame rate),分辨率(resolution)和像素格式(pixel type)。设置这些就要用到setVideoMode()方法。在此以前,你首先须要获取已配置视频流的传感器信息(SensorInfo),而后你才能选择一个可用的视频模式。
若是传感器支持裁剪,视频流会提供方法来控制它。使用VideoStream::isCroppingSupported()方法来肯定是否支持。
若是支持,使用setCropping()来使能裁剪和设置裁剪的具体配置。ResetCropping()方法被用来再次关闭裁剪。getCropping()方法用来获取当前的裁剪设置。
镜像,顾名思义,就是使视频流所展示的看起来就像在镜子里同样。启用或禁用镜像,使用VideoStream::setMirroringEnable()方法。设置true为启用,设置false为禁用。可用getMirroringEnable()来获取当前设置。
在固件层,大多数的传感器设置都存储为地址/值的队(address/value pairs,就是一种键值对)。因此能够经过setProperty和getProperty方法直接操做。这些方法被sdk内部用来实现裁剪,镜像,等等。而它们一般不会被应用程序频繁地使用,由于大多数有用的属性都被更加友好的方法封装了。
视频帧引用类封装了从视频流读取的单个帧的全部的相关数据。是视频流用来返回每个新的帧。它提供了访问包含了帧数据(元数据,工做所需的帧)基础数组。
视频帧引用对象是从VideoStream::readFrame()方法获取的。
视频帧引用数据能够从红外摄像头,RGB摄像头或者深度摄像头获取。getSensorType()方法用来肯定产生此帧的传感器类型。它会返回传感器类型,一个枚举值。
VideoFrameRef::getDate()方法返回一个直接指向帧数据的指针。类型为void,这样每一个像素的数据类型才能正确地索引。
每一个帧都会提供一系列的元数据来促进数据自己的工做。
数据帧引用知道视频流的裁剪设置,所以能够用来肯定裁剪框的原点,裁剪框的大小和帧是否启用裁剪功能。实现方法以下:getCropOriginX(),getCropOriginY(),getCroppingEnable().若启用裁剪功能,则裁剪框大小等于帧大小。因此肯定这些的方法和肯定帧分辨率的方法是同样同样儿的(东北话)。
每帧数据都有个时间戳。这个值是基于任意0值开始的微妙数。是不一样于两帧之间时间差。同一设备的全部流用的都是同一0值,因此时间戳的差值能够用来比较不一样流的帧。
OpenNI 2.0中,时间戳的0值是第一帧数据的到达时间。然而这没法保证每次都同样,因此程序代码应该使用时间戳增量。时间戳的值自己不该该用做一种绝对的时间指向。
除了时间戳,帧还提供了连续的帧索引号。这在肯定已知的两帧之间有多少帧颇有用。若是流使用了同步方法Device::setColorDepthSync(),那相应的帧的帧号应该就是一致的。
若是没有同步,那帧号将不必定匹配。这种状况下,用时间戳来肯定相关帧的位置更有效。
VideoFrameRef::getVideoMode()用来肯定生成当前帧的传感器的视频模式。信息包括像素格式,分辨率,帧率。
getDataSize()用来肯定图像数组中全部数据的大小。在分配存储帧的缓冲区时或者肯定帧数时颇有用。须要注意的是这是整个数组的数据大小。用VideoMode::getPixelFormat()来肯定每一个数组元素的大小。
getHeight()和getWidth()方法来肯定帧的分辨率很容易。这个数据数据也能够经过VideoFrameRef::getVideoMode().getResolutionX()和VideoFrameRef::getVideoMode().getResolutionY()来获取,但不适合频繁调用,由于过低效了。
VideoFrameRef::isValid()方法肯定当前视频帧引用是不是有效数据。
在视频帧引用初始化结构体和第一次数据加载之间调用会返回false。
肯定产生数据帧的传感器类型用getSensorType()。方法返回传感器类型,为如下的枚举值:
SENSOR_IR– for an image taken with an IR camera 红外传感器
SENSOR_COLOR – for an image taken with an RGB camera 彩图传感器
SENSOR_DEPTH – for an image taken with a depth sensor 深度传感器
包含帧的数组跨度能够用getStrideBytes()来获取。它将返回数组每行数据的大小,单位字节byte。主要用于索引二维图像数据。
记录器类用来记录视频数据到ONI文件中。ONI文件是OpenNI记录深度传感器输出的标准记录文件。包含了一到多个流的信息(如从一个PrimeSense传感器中同时记录一个深度和彩图流)。还包含了设备的设置信息。因此能够用来经过文件实例化设备对象。
设置一个记录器有三大步。
一,调用默认构造函数构造一个记录器对象。这不一样于其余类的实例化。
二,调用Recorder::creat()方法,参数为记录文件的文件名。建立和写入文件出错时返回一个错误码。
三,提供一个数据流进行记录。使用Recorder::attach()方法来联系上给定的视频流。若是你记录多个流,那就屡次调用来联系每一个视频流,也就是逐个添加(很明显是写API的人偷懒了)。
视频流联系上后,调用Recorder::start()方法开始记录。方法一调用,每帧数据都会被写入ONI文件。经过调用Recorder::stop()方法来结束记录。调用Recorder::destroy()方法来让文件存盘,释放全部内存。
ONI能够被许多OpenNI程序和公用程序进行重放。程序打开ONI文件都是做为文件设备打开的。重放控制封装在重放控制类里(Playback Class)。
除了OpenNI的主要类外,还有一系列的支撑类。这些类主要服务于封装数据,在其余主要类的章节都有所说起。
此类记录了设备的全部配置,包括设备名,URI,USB VID/PID描述符和供应商。
此类存储了传感器的全部配置,这里的传感器仅是三大传感器之一的一个。一个设备有多个传感器。
此类存储了分辨率,帧率和像素格式。用于视频流的设置和查看设置,由视频帧引用查看这些设置,由传感器信息提供一个视频模式的列表。
存储了RGB摄像头的设置,能够启用或禁用自动白平衡和自动曝光。
软件版本。由OpenNI发布。一些应用程序须要适配相应版本的时候使用。
结构体,存储彩色像素值。
OpenNI提供的简单数组类。包含图像数据。
坐标转换类用来进行真实坐标和深度坐标的转换。详情请参考API。
补充:
基于OpenNI开发的Middleware介绍
原文 :http://blog.csdn.net/yangtrees/article/details/8707603
OpenNI是一个简单高效的Kinect开发的开源框架,它有着简单易用的特色,很多大学和研究机构都选择它做为开发平台,而不选择功能强大的Kinect SDK,在这里给你们介绍几款基于OpenNI开发的Middleware:
提供完整的手势控制与身体控制API,手势定位和跟踪;人体骨架跟踪……
优势:占用CPU少,简单灵活,多平台支持(Windows、Linux、Mac OS and Andorid)
url:http://www.primesense.com/solutions/nite-middleware/
提供完整的3D手势跟踪框架的API
优势:无需任何标记跟踪3D手势的位置、方向、关节。
缺点:平台要求较高,
Presequisites:Windows7 64bit or Ubuntu 12.04 64bit workstation. NVidia GPU withCUDA support.
url:http://cvrlcode.ics.forth.gr/handtracking/
提供很是强大的天然用户交互借口,包括:包括手势重建(能达到手指精度)、手势识别、手势骨架跟踪。
优势:彻底开源,框架完整
Presequisites: OpenNI与NITE或KinectSDK,一些module与sample须要Boost、OpenCV、CUDA Toolkit,sample须要Qt。
根据手势的深度图提供手势的几何骨架。
Presequisites:Windowsx86/x64, .NET 4.
url:http://tiptep.com/index.php/products
原理:1.利用OpenCV的人脸检测在RGB图像中定位人脸;2.将人脸区域的深度数据转化为提早规范好的深度数据;3.将探测出的数据与数据库中的数据进行比对。
优势:The program提供探测和识别的基本函数集能够供二次开发。Real-time。
Reference:[1] R. Min, J. Choi, G. Medioni, J.-L. Dugelay, “ Real-Time 3D FaceIdentification from a Depth Camera”, 21st International Conference on PatternRecognition (ICPR), November 11-15, 2012.
Presequisites:支持GPU编程的显卡。
url: http://iris.usc.edu/USC-Computer-Vision.html
Volumental是一种最快捷和简便的方式,他能将扫描和分享任何你想到的对象包括:人、对象或房间。Volumental为你的浏览器提供一个插件来链接你的深度摄像机,使用专门的硬件和算法在云端重建3D模型。
Presequisites:Windows平台. Verified to work with Safari, Firefox and Chrome
url:http://www.volumental.com/
KScan3D提供完整的3D扫描数据的提取和处理方案,包含一个鲁棒性好的API和LUA-based自动化脚本。集成的脚本编辑器提供了一个基于gui控制台日志记录输出和调试脚本的语法方式。还能够经过API dll为你的项目提供来自KScan3D的功能,包括:扫描、对齐、网格处理。
Presequisites:Windows 7 or8(64-bit recommended)
KScan3D与SDK 1.7的Kinect Fusion的功能比较接近,可是只能无偿使用14天。
在OpenNI与NITE的基础上简化功能,增长高层特征。VIIM SDK的目标是为每位程序员提供更通用的NUI,它实际上就是加强版的OpenNI/NITE.
Presequisites:Windows 7 orlater ; x64/x86;
url: http://www.viim.pt/
GST(GlobalSensing Technologies)提供的很是简单的程序识别项目,GSTSkeletonPostures可以很是流畅的标记用户动做。
Presequisites:Windows 7 32or 64 bits, the last corresponding version of OpenNI2 and NiTE2 librariesinstalled. Project have been made using Microsoft SDK 7.1 and Microsoft visualC++ express 2010.
Motion Nexus Plugin经过OpenNI为Flash开发者提供工具和环境来创建真实的浸入式和交互式游戏与应用。
url:http://www.motionnexus.com/openni.html
特征提取SDK容许用户简单地提供(1)所需的感兴趣对象的模型,和(2)一种包含该对象的场景的三维扫描。该软件识别和定位对象在三维扫描的场景。凡高的星夜证实了这个SDK的特征提取能力,只是实时的三维物体识别和分析软件所提供的许多功能之一。
Presequisites:PC running Windows 7 with OpenNI 2.0 installed, Carmine sensor
url:http://www.vangoghimaging.com/3d _scanning_imaging_products.html
这些程序其实开源程度不同,你们能够移步:http://www.openni.org/作深刻了解~