Kinectfusion开源实现_配置Kinfu环境_Cmake编译PCL点云库_Kinect3D重建
2017-01-17 13:28
567 查看
Kinectfusion开源实现-配置Kinfu环境-Cmake编译PCL点云库
注:
1、此教程在win10_x64、VS2010_x86环境下,配置运行Kinfu、编译PCL点云库成功,其他环境也可参考;
2、主要参考前辈的博客http://blog.csdn.net/yzheately/article/details/50938322,然后加入自己遇到的问题及解决方案;
3、若想使用kinfu请使用vs2010,
Kinect一代,根据网上博客说OpenNI不支持二代,以后可以考虑用2代的官方驱动来读取Kinect2的数据,如果有人使用2代运行Kinfu成功的欢迎将方法分享在评论里。
1、准备
1.1工具准备:
VS2010_x86(http://www.xiazaiba.com/html/4614.html也可以自己找)
cmake3.5.0
OpenNI1.5.7
CUDA8.0
Microsoft.NET
Framework(如果是win10系统需要)
第三方库:
boost_1.60.0
eigen3.2.8
qhull_2015.2
VTK_7.0.0
flann_1.8.4
PCL源码
另外还可以根据需要下载安装microsoftmpi,在编译boost时,编译该功能,不需要就算了。
以上的软件和库,我打包放在了百度云盘:http://pan.baidu.com/s/1c1Rh3C
1.2安装配置OpenNI
a、准备
OpenNI-Win32-1.5.7.10-Dev.msi
nite-win32-1.5.2.21-dev.msi
SensorKinect093-Bin-Win32-v5.1.2.1.msi(上面百度云盘里有)
b、设置
想用openi获取Kinect的数据则首先不能安装Kinect官方的SDK,否则SDK会屏蔽openni的驱动,之前安装的话就卸掉。另win8、win10的同学需要先设置一下电脑(win7不需要),否则在安装SensorKinect093-Bin-Win32-v5.1.2.1.msi驱动时系统会提示“文件的哈希值不在指定的目录文件中。此文件可能已损坏”的警告导致驱动安装失败。
Win10的设置方法为点击左下角->设置->更新和安全->恢复->立刻重启(等一小会)->疑难解答->高级选项(之后重启)->启动设置->禁用驱动程序强制签名(倒数第三个,对应哪个数字就在键盘按几)->重启之后就可以了。
具体图文教程请参考:http://blog.sina.com.cn/s/blog_539fe4ca0102wh1x.html
c、安装
安装前请确保把旧版本的OpenNI和NITE卸载干净、第三方驱动卸载干净、Kinect不要插入电脑。依次安装OpenNI-Win32-1.5.7.10-Dev.msi、nite-win32-1.5.2.21-dev.msi、SensorKinect093-Bin-Win32-v5.1.2.1.msi(注意以下所有安装的路径最好都不要含有汉字以及空格,纯英文最好)。安装完毕后断网并且退出杀毒软件,否则会自动在网络上寻找Kinect的官方驱动,插上Kinect电源,将Kinect插入电脑,查看设备管理器,如果安装成功会出现
的图标,我的缺少了第三个Kinect
Motor,这个是控制Kinect上电机用的,无伤大雅,可以不管。如果不能自动找到驱动就右键手动更新驱动,目录在SensorKinect安装目录下。安装完成最好重启一下电脑。
d、检验
在openni目录下:C:\Program Files\openni1.5.7\Samples\Bin\Release中打开NiViewer.exe可以显示深度图;
在NITE目录下:C:\Program Files\PrimeSense\NITE\Samples\Bin\Release中的Sample-PointViewer.exe显示人体骨架。
都能显示表示OpenNI安装成功。
e、配置VS2010
OpenNI安装时会自动添加环境变量所以不需要手动添加。打开VS新建项目(注意这里不是空项目),右键项目选择属性,点击配置属性下面的VC++目录,在右侧包含目录中添加你OpenNI安装目录下的include目录,我的是D:\openni1.5.7\Include
同样在库目录中添加你OpenNI安装目录下的Lib目录,我的是D:\openni1.5.7\Lib;
之后在链接器->输入->附加依赖项中添加openNI.lib(和你Lib目录下的名字一定要一样否则编译时会报错提示打不开openNI.lib)
在工程下的源文件中打开stdafx.cpp,添加如下程序,运行成功看到深度图和彩色图表示OpenNI安装配置成功:
(此程序用OpenCV显示深度图和彩色图,安装配置OpenCV的教程网上很多也很成熟,不多赘述。)
#include "stdafx.h" #include <stdlib.h> #include <iostream> #include <string> #include <XnCppWrapper.h> #include "opencv/cv.h" #include "opencv/highgui.h" using namespace std; using namespace cv; void CheckOpenNIError( XnStatus result, string status ) { if( result != XN_STATUS_OK ) cerr << status << " Error: " << xnGetStatusString( result ) << endl; } int main( int argc, char** argv ) { XnStatus result = XN_STATUS_OK; xn::DepthMetaData depthMD; xn::ImageMetaData imageMD; //OpenCV IplImage* imgDepth16u=cvCreateImage(cvSize(640,480),IPL_DEPTH_16U,1); IplImage* imgRGB8u=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3); IplImage* depthShow=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); IplImage* imageShow=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3); cvNamedWindow("depth",1); cvNamedWindow("image",1); char key=0; xn::Context context; result = context.Init(); CheckOpenNIError( result, "initialize context" ); xn::DepthGenerator depthGenerator; result = depthGenerator.Create( context ); CheckOpenNIError( result, "Create depth generator" ); xn::ImageGenerator imageGenerator; result = imageGenerator.Create( context ); CheckOpenNIError( result, "Create image generator" ); XnMapOutputMode mapMode; mapMode.nXRes = 640; mapMode.nYRes = 480; mapMode.nFPS = 30; result = depthGenerator.SetMapOutputMode( mapMode ); result = imageGenerator.SetMapOutputMode( mapMode ); depthGenerator.GetAlternativeViewPointCap().SetViewPoint( imageGenerator ); result = context.StartGeneratingAll(); result = context.WaitNoneUpdateAll(); while( (key!=27) && !(result = context.WaitNoneUpdateAll( )) ) { //get meta data depthGenerator.GetMetaData(depthMD); imageGenerator.GetMetaData(imageMD); memcpy(imgDepth16u->imageData,depthMD.Data(),640*480*2); cvConvertScale(imgDepth16u,depthShow,255/4096.0,0); memcpy(imgRGB8u->imageData,imageMD.Data(),640*480*3); cvCvtColor(imgRGB8u,imageShow,CV_RGB2BGR); cvShowImage("depth", depthShow); cvShowImage("image",imageShow); key=cvWaitKey(20); } cvDestroyWindow("depth"); cvDestroyWindow("image"); cvReleaseImage(&imgDepth16u); cvReleaseImage(&imgRGB8u); cvReleaseImage(&depthShow); cvReleaseImage(&imageShow); context.StopGeneratingAll(); context.Shutdown(); return 0; }
2、编译第三方库
提醒:
1、PCL编译过程请联网!VS在编译VTK时需要自动下载一些文件,否则会编译失败!
2、第三方库最好都安装在默认目录。(也就是在后面cmake中设置CMAKE_INSTALL_PREFIX的值时,用默认目录)
2.1编译boost
若需要mpi则首先下载安装它(上面网盘里有),然后到boost_1_60_0\tools\build\src\tools\mpi.jam中修改下面几行:
249-251 line
local microsoft_mpi_sdk_path = "C:\\Program Files (x86)\\Microsoft SDKs\\MPI" ;
local microsoft_mpi_path = "C:\\Program Files\\Microsoft MPI" ;
if [ GLOB $(microsoft_mpi_sdk_path)\\Include : mpi.h ]
260-262 line
options = <include>$(microsoft_mpi_sdk_path)/Include
<address-model>64:<library-path>$(microsoft_mpi_sdk_path)/Lib/x64
<library-path>$(microsoft_mpi_sdk_path)/Lib/x86
268 line
.mpirun = "\"$(microsoft_mpi_path)\\Bin\\mpiexec.exe"\" ;
然后以管理员身份运行VS自带的cmd(“VS2010 工具下的Visual Studio命令提示符”),进入boost文件夹,运行bootstrap.bat,运行结束后会生成project-config.jam,
这里用到的简单cmd命令:
1、“d:”:进入d盘根目录,这里要进入你的安装盘
2、“dir”:查看当前所在目录的文件和文件夹
3、“cd name”:进入当前文件夹下的name文件夹中(name是想进入文件夹的名字,这里就是boost)
4、“name”:打开当前文件夹下名为name的文件,这里是bootstrap.bat,运行结束后会生成project-config.jam
打开project-config.jam并在第四行加上:using mpi ;(注意“;”前面有一个空格!) 接下来还是用cmd进入boost文件夹,运行如下命令编译boost:
(这里一定要注意,如果你的VS和第三方库都是32位的就只使用下面Win32环境的命令,64位只用X64环境的命令,我一开始两个都编译了结果到后面用VS生成PCL的时候生成失败了)
Win32环境:
b2.exe toolset=msvc-10.0 address-model=32 --build-dir=build\x86 install --prefix="C:\Program Files (x86)\Boost" -j8
X64环境:
b2.exe toolset=msvc-10.0 address-model=64 --build-dir=build\x64 install --prefix="C:\Program Files\Boost" -j8
其中msvc-10.0代表vs2010,msvc-11.0代表vs2012,如果是12.0是vs2013,14.0是vs2015。后面的C:\Program Files\Boost是boost的安装文件夹,你要换成你自己的安装目录。然后等着就好了,时间有点久(大约20分钟),耐心等。完成后在环境变量中建立BOOST_ROOT变量,值为boost文件夹安装地址,比如C:\Program
Files\Boost.
2.2编译eigen
使用cmake,分别设置eigen的source和build路径(source路径其实就是含有CMakeLists.txt的文件夹,其实就是source的根目录,我的路径是E:\pcl\Eigen),如build不存在,点击Configure会提示新建build文件夹,选择vs10-2010编译器,这里注意Configure时有CMAKE_INSTALL_PREFIX这个选项,默认为C:\Program
Files\Eigen.这里的路径即为该软件最后的安装路径(也是环境变量中要设置的EIGEN_ROOT的路径,可设置为你想要的其它路径,后边的FLANN,QHULL,VTK也是一样道理).然后Generate在build目录下生成VS工程。
之后以管理员身份运行VS2010(否则install时会失败),打开bulid文件夹下的eigen.sln工程,待加加完文件后,生成ALL_BUILD(Debug和 Release均要生成),完成后生成INSTALL(Debug and Release)就在那一大堆工程里,一般就在ALL_BUILD的下面。可以看到eigen安装路径中出现include文件夹。最后在环境变量中建立EIGEN_ROOT变量,值为eigen的安装路径。
2.3编译qhull
使用cmake,分别设置qhull的source和build路径,如build不存在,点击Configure会提示新建build文件夹,选择vs10-2010编译器.注意根据需要修改CMAKE_INSTALL_PREFIX,然后添加一个entry:
Name: CMAKE_DEBUG_POSTFIX
Type: STRING
Value: -d
修改完后再次点Configure,然后Generate。以管理员身份运行VS2010并打开qhull.sln工程文件,待加载完文件后,完成后生成ALL_BUILD(debug和release),然后生成INSTALL(Debugand Release)。完成后可以看到qhull安装路径中出现include和lib文件夹。最后在环境变量中建立QHULL_ROOT变量,值为qhull安装地址。
2.4编译VTK
使用cmake,分别设置VTK的source和build路径,如build不存在,点击Configure会提示新建build文件夹,选择vs10-2010编译器.注意根据需要修改CMAKE_INSTALL_PREFIX选项,然后添加一个entry:
Name: CMAKE_DEBUG_POSTFIX
Type: STRING
Value: -gd
修改完后再次点Configure,然后Generate。以管理员身份运行VS2010并打开VTK.sln工程文件,待加载完文件后,生成ALL_BUILD(debug和release)(时间有点久,很久,有时各自需要一两个小时,最快一般也要半个小时,耐心等待),完成后生成install(debug和release)。完成后可以看到VTK文件夹中出现include和lib文件夹。最后在环境变量中建立VTK_ROOT,为VTK安装路径.
2.5编译flann
使用cmake,分别设置Flann的source和build路径(如C:\flann,C:\flann\build),选择vs10-2010编译器.注意根据需要修改CMAKE_INSTALL_PREFIX,然后去掉BULID_MATLAB_BINDINGS和BULID_PYTHON_BINDINGS的勾选,不bulid它们
然后添加一个entry:
Name: CMAKE_DEBUG_POSTFIX
Type: STRING
Value: -gd
修改完后再次点Configure,然后Generate。在C:\flann\src\cpp\flann\util(源码)中找到serialization.h文件 在92行BASIC_TYPE_SERIALIZER(bool)之后加入以下代码:
#ifdef _MSC_VER
BASIC_TYPE_SERIALIZER( unsigned __int64 );//注意此处__int64是两个下划线连一起
#endif
修改完后以管理员身份运行VS2010并打开flann.sln工程文件,待加载完文件后,(debug和release)生成all_build,完成后生成install(Debugand Release)。完成后可以看到flann安装路径下出现include和lib文件夹。最后在环境变量中建立FLANN_ROOT变量,值为flann安装路径。
2.6安装CUDA
最好安装最新版的CUDA,安装CUDA过程中不要用默认的精简安装,选择自定义,全选后继续安装,安装完毕重启下电脑。
推荐教程:http://www.cnblogs.com/xing901022/p/3248469.html
注意:
1、一定要先安装VS2010,再安装CUDA,不然CUDA会找不到编译器导致在VS2010中不能使用CUDA
2、系统是win10的话还需要安装一个Microsoft.NET Framework(去百度一搜Microsoft.NET Framework下载,上面网盘里也有)不然会报错,我安装的是3.5。
3、在选项->选择安装位置时不能选择一开始的解压目录下,不然安装完成后解压目录会被删除,安装的文件也会随之删除造成失败
4、配置VS时我选择的是手动配置,也不难
按上面教程里的程序运行,出现这样的控制台窗口显示sum(CPU)就说明安装好了
2.7最后配置PCL(重头戏)
可以在Githubhttps://github.com/PointCloudLibrary/pcl点击网页右上方的Clone
or download即可下载到PCL最新的源码。
使用cmake选择source和build文件夹,点击Configure(此时最好把Grouped和Advanced勾选,),选择vs10-2010编译器,正常情况下不会出现什么问题:(警告可以忽略,如果出现错误八成是前面的库没有配置好,按照错误提示去修改) 运行完展开bulid,可以选择我们要编译的模块,有些模块不能勾选,否则生成会出错,具体勾选哪些模块参考下面截图,如果漏选可能会导致生成的VS工程中没有Kinfu_larger_Scale这个解决方案。其中如果要使用kinfu需要勾选GPU,以及CUDA,还要勾选WITH下面的openni:
参考的博客里说有时在configure后会出现找不到Boost的情况(我没有遇到),解决办法是手动添加,下面是Boost下拉栏中的截图,可以作为参考,配置那些没有找到的库:
如果VTK没有找到,可手动添加,它自己找到的话就不用管了:
注意根据需要修改CMAKE_INSTALL_PREFIX(我的路径为C:\ProgramFiles\PCL),再次点击Configure,检查BUILD目录下有没有BUILD_gpu_kinfu_large_scale 并且确认勾选(没有的话生成的工程中就没有Kinfu_larger_Scale)
然后generate生成.以管理员身份运行VS2010并打开PCL.sln,生成ALL_BUILD(Debug和Release模式,各自得半小时左右). 随后生成INSTALL(Debug and Release),最后在环境变量中建立PCL_ROOT变量,值为PCL安装路径。PCL成功安装!!!
想看Kinfu_larger_scale的运行效果只需用VS2010打开PCL.sln,右键pcl_kinfu_lager_scale解决方案->设置为启动项目,然后点运行即可看到效果!
耗时半个月终于弄好了啊啊啊啊啊!!!!!
如果运行提示无法定位程序输入点...于动态链接库....dll点击确定就好,不影响运行(如果有知道原因以及解决方法的欢迎通过评论告诉我)
下面附上效果图:
相关文章推荐
- 乐山程序员联盟
- PHP入门Demo(只为前端了解)When you really want to know a thing, You will see is really very simple.
- TCP:WireShark分析,序列号Seq和确认号Ack
- [置顶] iOS 获取当前控制器的顶层控制器
- 设计模式——单例模式
- [置顶] (二)GreenDao3.0的数据库升级
- 41、Power Query-Text.Combine函数进阶2
- Linux环境下共享库(动态链接库)的简要介绍(如何创建共享库)
- django认证系统实现自定义权限管理
- maven (生成war包时候同时生成jar包到lib)
- luogu2756飞行员配对问题
- TRUNCATE和DELETE的区别
- 作业3:DDS
- oc代理模式
- java缓存技术概括
- 在ARM-linux上实现4G模块PPP拨号上网(转)
- break
- 微信分享统计
- 使用 jQuery.i18n.properties 实现 Web 前端的国际化
- 120. Triangle