openni2+nite2实现人体跟踪(从oni文件读取数据)
参考博客:Heresy的博客:https://kheresy.wordpress.com/2013/01/07/basic-usage-of-nite2/
http://viml.nchc.org.tw/blog/paper_info.php?CLASS_ID=1&SUB_ID=1&PAPER_ID=533
由于PrimeSense被Apple收购的关系,OpenNI官网已经关闭,而PrimeSense的NiTE也不再维护了,所以nite2的教程变得十分残缺不全,对于nite环境的搭建,现总结如下。
由于openni2的环境搭建之前已经总结,下面只对nite2的环境搭建进行说明。
首先感谢Heresy的博客提供的帮助。顺便吐槽一句,openni2和nite2的函数命名和使用确实比openni简明许多。
一、基础搭建环境
首先,同openni2一样,我们需要在vs中的属性页中对项目属性进行配置。添加对应的库目录,包含目录以及附加依赖项。
(摘自Heresy的博客)
其次,我们需要将NiTE 2的安装目录下的Redist文件夾里的所有文件copy到vs当前工程的工作目录。如图:
注意,不是debug目录!!!不然会报错!!
Debug目录为:F:\Kinect\test\oni-joint\x64\Debug,我们之前搭建openni2环境时需要把openni2的Redist文件夹里的内容放在这个debug目录下,如图:
ERROR1:没有添加nite2的对应文件到工程里,会出现找不到NiTE2.dll。
ERROR2:将nite2的文件添加到debug目录下,而不是工作目录。这才是最可怕的。会遇到:Could not find data file .\NiTE2/s.dat,current working directory = F:\Kinect\test\oni-joint\oni-joint
进行debug调试的会出现引发异常:
以上两个错误都不是oni文件出问题,而是应该把nite2的Redist文件夹中的文件添加到工作目录,而非debug目录。工作目录就是报错给出的current working directory。
- 更改工作目录(可选)
如果觉得直接将文件复制到默认工作目录文件显得太杂,那我们可以更改当前工程的工作目录。即新建一个文件夹,把nite2的文件放进去,将vs工程的工作改为当前目录。
属性页->调试->工作目录
- 读取oni文件实现Usertracker
用nite2实现人体跟踪网上有许多代码和解析(比如Heresy的博客介绍非常全面),这就不详细说明了。主要说明读取oni文件代替Kinect或其他深度相机作为输入。
只要将mDevice.open( ANY_DEVICE );改为mDevice.open(oni文件.oni)即可。如图:
同时,在下面建立深度和彩色模型时,参数应该与oni文件记录时的参数一致。其中,mDMode.setPixelFormat( );设置像素格式这个函数在不清楚具体格式的时候建议不使用,采用mDepthStream.getVideoMode();获取。具体使用如下:
// 创建深度数据流
VideoStream mDepthStream;
mDepthStream.create(mDevice, SENSOR_DEPTH);
// 设置VideoMode模式
VideoMode mDepthMode=mDepthStream.getVideoMode();
mDepthMode.setResolution(640, 480);
mDepthMode.setFps(25);
mDepthStream.setVideoMode(mDepthMode);
由于文件处理需要时间,我们要保证对每一帧做处理应该使用PlaybackControl对播放速率和是否重播进行控制。详细见Heresy的博客。
- 关于Kinect采集的oni文件在mUserTracker.create(&mDevice)时报错的问题
这里的‘memory access violation error’的报错与上面提到异常一致,在确认上述工作空间没问题后,再考虑oni文件出错。
详情请参考:http://viml.nchc.org.tw/blog/paper_info.php?CLASS_ID=1&SUB_ID=1&PAPER_ID=533
大致就是在记录需要修改一下函数的信息,如果是记录好的文件,可以使用一个叫oniFixer的小程序,进行检查和修正当前的oni文件。
使用方法为:打开cmd,进入onifixer所在的文件夹,输入命令:
oniFixer old.oni new.oni