关于OpenNI(1.5/2)和OpenCV的那些事——环境搭建(Windows8.1, 64位系统, VS2012/2013, 华硕XtionProLive)

今天着手写这篇博客,真的是已经被OpenNI虐的不行的,浏览了国内国外好多博客,论坛,但是版本,环境,设备,操作系统的不同,使得我最终放弃了cmake重新编译opencv(with_openni)的做法,改成直接使用openni。两者的区别在于获取图象时,使用重新编译过的opencv时,经过opencv的强大处理,我们不仅可以得到彩色图像,深度图,还可以直接得到视察图,甚至三维点云;而使用openni读取只是彩色和深度图像。接下来讲述下我的悲惨经历,希望大家借鉴下不要再走弯路,有什么不足之处希望大家指正。


首先需要提一点,关于我使用的XtionProLive,需要先装openni, nite和sensor驱动(当然nite不是必须,如果想要获得骨骼信息等,需要这个插件)。OpenNI2的话不需要再装驱动,直接装了openni2就能用xtion了。这里我也翻了很多跟头,就是无论我装什么版本,什么环境下的openni,驱动都有问题,xtion插上就是没反应。开始我认为是win8的问题,但是华硕官网上有win8的驱动,加上大量的测试以及官网上的firmware,我发现是USB接口的问题.. 修复之前xtion只能在USB2.0上用,想要在3.0上用,必须先使用2.0连接xtion,然后使用官网提供的firmware去修复,然后就可以在USB3.0上识别使用了。


接着我尝试着用cmake(3.2)在win8.1_x64上去重新编译opencv(2.4.10) with openni(1.5),借鉴了这两篇文章(1)和(2),当然都是64位系统。【网上有很多32位的我也就没看。因为一开始我认为在64位系统不能使用32位的openni及相关RGB-D驱动。后来发现不是这样,作为开发,无论32位还是64位的库都可以用。然而后来我发现无论32位还是64位我重新编译的都不能用,原因后面说明。】 使用cmake编译了很多次,生成的opencv.sln使用vs2012/2013打开,ALL_BUILD,都没有成功。我以为是相关函数库不够,借鉴文章(2)使用了TBB,不行;又借鉴了文章(1)自己编译openni1.5和sensor,然后在编译opencv,也不行。但后者给了我一个很大的提示:在编译openni1.5的过程中,我发现XnPlatform.h中规定vs2010之后的编译器不能编译之。文章(1)中注释掉了那段代码才编译通过,所以在编译opencv的时候,我留意了一下报的错误,其中第一条就是说vs2010之后的编译器不通过,所以我也跑到XnPlatform.h中注释了那段代码,再次编译opencv.sln,成功生成debug和release版本的lib和dll。


配置好开发环境(注意根据编译时32位和64位的不同,要选取不同的include, lib,环境变量dll也要注意)后,参考opencv官网说明,我编写了代码,然而xtion只能获得第一帧彩色图像和深度图像,然后就卡那了。我尝试了opencv自带的openni_capture.exe例子(cmake重新编译过的带openni版本的example),也是卡在了第一帧。我试了很多依然没有解决这个问题,只能放弃。但心里真的很不开心,毕竟为了cmake出一个能用openni的opencv我是费了多少精力啊,然并卵。


回到原点,只能使用openni的函数获得彩色图和深度图,然后自己三维重建了,直接使用opencv获得三维点云的想法失败了。然后我分别试了openni1.5和openni2,借鉴文章(3)和文章(4)。和文章(4)里不同的是,对于openni2来说,深度图可以640*480并且持续获得图像,而彩色图只能320*240才能持续获得图像。注意是持续获取。文章(4)里说彩色图像无论怎么设置都是320*240,在我这里测试的结果是非320*240也能显示,只是只能获得第一帧就卡了。而且使用openni1.5也是,彩色图320*240持续获得图像,深度图640*480持续获得图像。和openni2不同的是,彩色图像改为640*480也可以持续,但此时深度图就只能获得第一帧。所以在我的环境下:win8.1,使用openni开发win32/x64程序,彩色图只能是320*240,深度图则640*480/320*240都可以。(补充一点:单独使用彩色图生成器的话,640*480是可以持续的,我估计是两者都有的时候数据量太大吧)


考虑到这个问题,我的脑子里突然一个闪光,opencv只能获得一帧就卡住的那个时候,是不是也是因为分辨率的问题?重新跑了一遍之前的程序,改了分辨率,依然失败,所以还是使用openni一步一步慢慢来吧。当然这些都是对于华硕xtion,对于kinect来说可能完全不一样。而我综合比较了xtion和kinnect,我觉得前者更方便,毕竟openni原生支持。还有我认为不能直接使用opencv获取xtion图像什么的挺好的,至少我还可以对怎么处理深度图为三维点云有更深了解。嗯,多学学还是不错(-_-无奈)。

你可能感兴趣的:(opencv,图像处理,openni,计算机视觉)