从周二到周六,搭了整整四天半,网上也没有任何资料,让我这个小白很是磨练了一番啊!
废话不多说,直接上
搭建环境:win10+VS2013+QT5(完全64位平台)
准备工作:
1.opencv:我装的2.4.9的,windows下装很简单的,这里就不提了
2.boost:我装的1.60的,64位编译:
先从开始菜单启动Visual Studio的Visual Studio 2013 x64 Win64 Command Prompt进入命令提示符。然后转到boost根文件夹,运行bootstrap.bat生成x64版的bjam.exe。然后运行命令:
bjam --build-type=complete toolset=msvc-9.0 threading=multi link=shared address-model=64
3.安装Doxygen、Eigen:这两个库的安装方法在之前的ElasticFusion Windows下的搭建方法里:http://blog.sina.com.cn/s/blog_882405bf0102x84x.html
4.安装QT5:下载合适你的编译器的qt,我使用的是qt-opensource-windows-x86-msvc2013_64-5.6.0.exe,双击安装就可以,然后同样在上面那个网站里下载vs插件,我用的qt-vs-addin-1.2.5.exe。
5.安装QGLViewer:在这里下载 http://libqglviewer.com/src/ 按照官网教程编译即可,我使用的2.6.3,建议用这个版本的,因为我用2.7.0的不行。。。
6.OpenGL的环境准备好,包括glut32.lib、glew32.lib,opengl32.lib。注意要放在64位对应的文件夹里。可以参考http://www.chongchonggou.com/g_415054816.html
正式编译FastFusion:
1.从github上把它下载下来
2.修改CMakeLists.txt:我把我的CMakeLists贴在这里,注意对应路径要修改:
第一个在src文件夹外的CMakeLists.txt:
cmake_minimum_required(VERSION 2.8)
set(OpenCV_LIBS opencv_core opencv_imgproc opencv_highgui opencv_calib3d)
set(CMAKE_BUILD_TYPE Release)
#set(CMAKE_BUILD_TYPE RelWithDebInfo)
#set(ROS_BUILD_TYPE RelWithDebInfo)
#set(CMAKE_BUILD_TYPE Debug)
#set(ROS_BUILD_TYPE Debug)
#FIND_PACKAGE(Qt4 REQUIRED)
find_package(OpenCV REQUIRED)
#find_package(TBB)
#if(NOT TBB_FOUND)
#MESSAGE(STATUS "TBB not found!");
#else(NOT TBB_FOUND)
#include_directories(${TBB_INCLUDE_DIRS})
#link_directories(${TBB_LIBRARY_DIRS})
#endif(NOT TBB_FOUND)
if (CMAKE_COMPILER_IS_GNUCC)
execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion
OUTPUT_VARIABLE GCC_VERSION)
string(REGEX MATCHALL "[0-9]+" GCC_VERSION_COMPONENTS ${GCC_VERSION})
list(GET GCC_VERSION_COMPONENTS 0 GCC_MAJOR)
list(GET GCC_VERSION_COMPONENTS 1 GCC_MINOR)
message(STATUS "GCC Major Version is " ${GCC_MAJOR})
message(STATUS "GCC Major Version is " ${GCC_MINOR})
endif()
set(CMAKE_C_FLAGS
-frounding-math
#-Wall
)
#Mohamed Visual Studio 2010 -
#enabling Intel Advanced Vector Extensions AVX (part 1).
#AVX2 is in later visual studio builds i think
message(STATUS "Compiling without AVX/AVX2 support")
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:AVX2 -DOWNAVX") #the flag OWNAVX is just for the ifdefs in the code, i think
#set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /arch:AVX2 -DOWNAVX")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fopenmp")
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DPRINT_DEBUG")
#set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DPRINT_DEBUG")
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
include_directories(${PROJECT_SOURCE_DIR}/src)
message(STATUS "PROJECT_SOURCE_DIR is " ${PROJECT_SOURCE_DIR})
include_directories(${PROJECT_SOURCE_DIR}/src/mohamed_util)
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp")
#set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fopenmp")
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DPRINT_DEBUG")
#set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DPRINT_DEBUG")
#set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
#set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
#include_directories(${PROJECT_SOURCE_DIR}/src)
#message(STATUS "PROJECT_SOURCE_DIR is " ${PROJECT_SOURCE_DIR})
#set(Boost_DEBUG 0)
#set(BOOST_USE_STATIC_LIBS OFF)
#set(BOOST_USE_MULTITHREADED ON)
#set(BOOST_USE_STATIC_RUNTIME OFF)
#find_package(Boost COMPONENTS thread system tr1)
#include_directories(${Boost_INCLUDE_DIRS})
#find_package(Eigen3 REQUIRED)
#include_directories(EIGEN3_INCLUDE_DIR)
include_directories("D:/Elastic/Eigen")
## CUDA
#set(CUDA_TOOLKIT_ROOT_DIR "/work/sdks/cudaversions/cuda50/")
# find_package(CUDA 5.0 REQUIRED)
# if(CUDA_FOUND)
# message("Found CUDA")
# else(CUDA_FOUND)
# message("CUDA is not installed on this system.")
# endif()
# execute_process( COMMAND nvcc --version )
# include_directories(${CUDA_TOOLKIT_ROOT_DIR}/include)
# set(TEST_CUDA_ARCH $ENV{CUDA_ARCH})
# if(TEST_CUDA_ARCH)
# message(STATUS "The GPU Architecture is set to $ENV{CUDA_ARCH} in an Environment Variable")
# set(CUDA_ARCH $ENV{CUDA_ARCH})
# else(TEST_CUDA_ARCH)
# message(STATUS "No GPU Architecture set, setting to sm_13")
# set(CUDA_ARCH sm_11)
# endif(TEST_CUDA_ARCH)
# #if(${CUDA_ARCH} matches sm_11)
# #set(CUDAARCHNUMBER 11)
# #elseif(${CUDA_ARCH} matches sm_13)
# #set(CUDAARCHNUMBER 13)
# #elseif(${CUDA_ARCH} matches sm_20)
# #set(CUDAARCHNUMBER 20)
# #endif(${CUDA_ARCH} matches sm_11)
# set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} -arch=${CUDA_ARCH})
#include_directories(${PROJECT_SOURCE_DIR}/external)
#include_directories(${PROJECT_SOURCE_DIR}/external/math)
#include_directories(${PROJECT_SOURCE_DIR}/include)
#include_directories(${PROJECT_SOURCE_DIR}/build/src)
#include_directories("/usr/include/nvidia-current/cuda")
# find_package(PCL 1.5 REQUIRED COMPONENTS common io filters)
# include_directories(${PCL_INCLUDE_DIRS})
# link_directories(${PCL_LIBRARY_DIRS})
# add_definitions(${PCL_DEFINITIONS})
#include(${QT_USE_FILE})
#add_definitions(${QT_DEFINITIONS})
# Doxygen integration
find_package(Doxygen)
if(DOXYGEN_FOUND)
#this adds the correct folder to INPUT= :
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile @ONLY)
#add doc target
add_custom_target(doc
${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMENT "generating docs with Doxygen" VERBATIM
)
endif(DOXYGEN_FOUND)
add_subdirectory(src)
第二个在src文件夹里的CMakeLists.txt:
add_subdirectory(camerautils)
add_subdirectory(auxiliary)
#add_subdirectory(auxiliaryGPU)
#add_subdirectory(libelas)
#add_subdirectory(output)
add_subdirectory(fusion)
#add_subdirectory(fusionGPU)
#add_subdirectory(sophus)
#add_subdirectory(filesystem)
include_directories("D:/qt5.6/qt5/5.6/msvc2013_64/include/QtXml")
include_directories("D:/qt5.6/qt5/5.6/msvc2013_64/include")
include_directories("D:/qt5.6/qt5/5.6/msvc2013_64/include/QtWidgets")
include_directories("D:/qt5.6/qt5/5.6/msvc2013_64/include/QtCore")
include_directories("D:/qt5.6/qt5/5.6/msvc2013_64/include/QtXml")
include_directories("D:/qt5.6/qt5/5.6/msvc2013_64/include/QtGui")
include_directories("D:/qt5.6/qt5/5.6/msvc2013_64/include/QtOpenGL")
ADD_DEFINITIONS(${QT_DEFINITIONS})
# add_executable(cameracalibration cameracalib_main.cpp)
# target_link_libraries(cameracalibration
# opencv_core opencv_imgproc opencv_highgui opencv_features2d opencv_calib3d
# )
#
# add_executable(rectify_known rectify_stereo_known_main.cpp)
# target_link_libraries(rectify_known
# opencv_core opencv_imgproc opencv_highgui opencv_features2d opencv_calib3d
# )
FIND_PACKAGE(Qt5 REQUIRED COMPONENTS Core Gui OpenGL Xml)
QT5_WRAP_CPP(onlinefusion_HEADERS_MOC onlinefusionviewer.hpp)
QT5_WRAP_CPP(sources $
{moc-sources}
OPTIONS -DBOOST_TT_HAS_OPERATOR_HPP_INCLUDED)
add_executable(onlinefusion
onlinefusionviewer_main.cpp
onlinefusionviewer.cpp
${onlinefusion_HEADERS_MOC}
)
target_link_libraries(onlinefusion
geometryfusion_mipmap_cpu geometryfusion_aos
camerautils
auxiliary
${OpenCV_LIBS}
${QGLVIEWER_LIBRARIES}
QtCore QtGui QtOpenGL
glew32
opengl32
glut32
)
第三个在fusion文件夹里的CMakeLists.txt:
include_directories("/usr/include/nvidia-current/cuda")
include_directories("/work/sdks/cudaversions/cuda50/cuda/include")
include_directories("/home/steinbrf/sdks/cudaversions/cuda50/cuda/include")
#find_package(Qt REQUIRED)
#INCLUDE(${QT_USE_FILE})
include_directories("D:/qt5.6/qt5/5.6/msvc2013_64/include/QtXml")
include_directories("D:/qt5.6/qt5/5.6/msvc2013_64/include")
include_directories("D:/qt5.6/qt5/5.6/msvc2013_64/include/QtWidgets")
include_directories("D:/qt5.6/qt5/5.6/msvc2013_64/include/QtCore")
include_directories("D:/qt5.6/qt5/5.6/msvc2013_64/include/QtXml")
include_directories("D:/qt5.6/qt5/5.6/msvc2013_64/include/QtGui")
include_directories("D:/qt5.6/qt5/5.6/msvc2013_64/include/QtOpenGL")
ADD_DEFINITIONS(${QT_DEFINITIONS})
include_directories("..")
add_library(geometryfusion_aos STATIC
geometryfusion_aos.cpp
treeandbrick.cpp
treeandbrick_indexed.cpp
treeandbrick_incremental.cpp
treeandbrick_incremental_recursive.cpp
mesh.cpp
#meshcelltraversal.cpp
mesh_interleaved.cpp
mesh_interleaved_meshcell.cpp
)
add_library(geometryfusion_mipmap_cpu STATIC
geometryfusion_mipmap_cpu.cpp
loopclosure.cpp
)
3.使用cmake编译:
出现找不到OpenCV的错:自己把/opencv/build的路径加在cmake里
出现找不到qt5的错:把\qt5.6\qt5\5.6\msvc2013_64\lib\cmake的路径加在cmake里
configure、generate成功
4.用vs2013打开刚才cmake编译出来的Project.sln
auxiliary编译
A.先在属性管理器里的releaseX64中的C++常规里添加附加包含目录:D:\boost\boost_1_60_0
B.把threadpool.h文件中的
//#include <boost/thread/pthread/mutex.hpp>
注释掉,不然会产生冲突
C.修改memory.cpp如下
/*
* memory.cpp
*
* Created on: Feb 27, 2013
* Author: steinbrf
*/
#include "memory.hpp"
//#include <unistd.h>
#include <fstream>
#include <string>
#include <Windows.h>
long long getTotalSystemMemory()
{
/* long long pages = sysconf(_SC_PHYS_PAGES);
long long page_size = sysconf(_SC_PAGE_SIZE);
return pages * page_size;*/
MEMORYSTATUSEX status;
status.dwLength = sizeof(status);
GlobalMemoryStatusEx(&status);
return status.ullTotalPhys;
}
long long getAvailableSystemMemory()
{
/*long long pages = sysconf(_SC_AVPHYS_PAGES);
long long page_size = sysconf(_SC_PAGE_SIZE);
return pages * page_size;*/
MEMORYSTATUSEX status;
status.dwLength = sizeof(status);
GlobalMemoryStatusEx(&status);
return status.ullAvailPhys;
}
ProcessMemoryStats getProcessMemory(){
std::fstream file("/proc/self/statm");
ProcessMemoryStats result;
file >> result.size;
file >> result.resident;
file >> result.shared;
file >> result.trs;
file >> result.drs;
file >> result.lrs;
file >> result.dt;
result.pageSize = 1;// sysconf(_SC_PAGE_SIZE);
return result;
}
D.报uint未识别,直接把包含uint的那个函数注释掉,这个可能是因为opencv2.4.9里没有uint,opencv3.0可能就有了
改完这些地方编译(build)即可成功
camerautil编译
A.同样在属性管理器里加上boost
编译即可成功
geometryfusion_aos编译
A.在属性管理器里加上boost
B.在definition.h文件的末尾修改ALIGNED的定义:
#define ALIGNED __declspec(align(16))
在此文件末尾添加:
#define posix_memalign(p, a, s) (((*(p)) = _aligned_malloc((s), (a))), *(p) ?0 :errno)
编译即可成功
geometryfusion_mipmap_cpu编译
A.在属性管理器加上boost
B.他有好多用变量初始化数组个数的写法,把这些数组改为用new 分配,如:
int *vxt = new int[_imageWidth];
int *vyt = new int[_imageWidth];
int *vzt = new int[_imageWidth];
C.把
__attribute__ ((aligned (16)))
变成 ALIGNED
即可编译成功
onlinefusion编译
A.在属性管理器的包含目录加上boost,加上QGLViewer(D:\libQGLViewer-2.6.3)
B.在附加库目录里加上boost(D:\boost\boost_1_60_0\stage\lib);qt5(D:\qt5.6\qt5\5.6\msvc2013_64\lib);QGLViewer(D:\libQGLViewer-2.6.3\QGLViewer)
C.在附加依赖项里把qt5的lib名称改对,加上QGLViewer2.lib
D.报错找不到glx.h时,把这个头文件直接注释掉
E.在onlinefusionviewer.cpp里加上
#include<QGLViewer/manipulatedFrame.h>
F.把definition.h里的 not define 统统变成 !define
即可编译成功。
最后进入bin文件夹,把depth和rgb文件夹考到bin文件夹下,从命令行运行即可。注意这里编译fastfusion时都是用release编译的。