下载例程所需数据
http://rpg.ifi.uzh.ch/datasets/remode_test_data.zip
解压后,将在 test_-data/Images 中发现从 0 至 200 的所有图像,并在 test_data 目录下看到一个文本文件,它记录了每张图像对应的位姿。
程序输出的信息比较简洁,仅显示了迭代次数、当前图像和深度图。关于深度图,我们显示的是深度值乘以 0.4 后的结果——也就是纯白点(数值为 1.0)的深度约 2.5 米,颜色越深表示深度值越小,也就是物体离我们越近。如果实际运行了程序,应该会发现深度估计是一个动态的过程——从一个不怎么确定的初始值逐渐收敛到稳定值的过程。我们的初始值使用了均值和方差均为 3.0 的分布。当然你也可以修改初始分布,看看对结果会产生怎样的影响。
编译此程序后,以数据集目录作为参数,运行之:
./dense_mapping ../../remode_test_data/test_data
结果:
Average squared error = 0.350139, average error: -0.0846462
*** loop 9 ***
迭代9次的结果:
Average squared error = 0.291299, average error: -0.0392129
*** loop 30 ***
迭代30次的结果:
从截图可以发现,当迭代次数超过一定次之后,深度图趋于稳定,不再对新的数据产生改变。观察稳定之后的深度图,我们发现大致可以看出地板和桌子的区别,而桌上的物体深度则接近于桌子。整个估计大部分是正确的,但也存在着大量错误估计。它们表现为深度图中,与周围数据不一致的地方,为过大或过小的估计。此外,位于边缘处的地方,由于运动过程中看到的次数较少,所以亦没有得到正确的估计。综上所述,我们认为这个深度图的大部分是正确的,但没有达到预想的效果。
CMakeList.txt:
cmake_minimum_required(VERSION 2.8)
project(ch12)
set(CMAKE_BUILD_TYPE Release)
set(CMAKE_CXX_FLAGS "-std=c++11 -O2")
# opencv
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
# eigen
include_directories("/usr/include/eigen3/")
# pcl
find_package(PCL REQUIRED)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})
# octomap
find_package(octomap REQUIRED)
include_directories(${OCTOMAP_INCLUDE_DIRS})
add_executable(pointcloud_mapping pointcloud_mapping.cpp)
target_link_libraries(pointcloud_mapping ${OpenCV_LIBS} ${PCL_LIBRARIES})
add_executable(octomap_mapping octomap_mapping.cpp)
target_link_libraries(octomap_mapping ${OpenCV_LIBS} ${PCL_LIBRARIES} ${OCTOMAP_LIBRARIES})
add_executable(surfel_mapping surfel_mapping.cpp)
target_link_libraries(surfel_mapping ${OpenCV_LIBS} ${PCL_LIBRARIES})
首先需要安装pcl库
sudo apt-get install libpcl-dev pcl-tools
ifstream fin("../data/pose.txt");
boost::format fmt("../data/%s/%d.%s"); //图像文件格式
$ ./pointcloud_mapping
正在将图像转换为点云...
转换图像中: 1
转换图像中: 2
转换图像中: 3
转换图像中: 4
转换图像中: 5
点云共有1309800个点.
滤波之后,点云共有31876个点.
pcl_viewer map.pcd
$ ./surfel_mapping map.pcd
point cloud loaded, points: 31876
computing normals ...
computing mesh ...
display mesh ...
sudo apt-get install liboctomap-dev octovis
ifstream fin("../data/pose.txt");
boost::format fmt("../data/%s/%d.%s"); //图像文件格式
$ ./octomap_mapping
正在将图像转换为 Octomap ...
转换图像中: 1
转换图像中: 2
转换图像中: 3
转换图像中: 4
转换图像中: 5
saving octomap ...
octovis octomap.bt
Ubuntu18.04 扩展磁盘