概述
本博客记录我使用ORB-SLAM2+立体匹配的算法实现一个简单的三维重构系统的过程。
我的思路是这样:从一组双目序列中,得到一条轨迹,在轨迹上对一帧中的两张图作三维重构,并画在帧所在的坐标上,这样就能得到一组数据三维重构的结果。因此,可以用ORB-SLAM2来得到这条轨迹;三维重构需要用到立体匹配的算法,我打算采用opencv封装好的SGBM,但不失扩展性我会采取一些方法保证算法可以随时变更。由于系统在以后有可能变成实时的,因此图像序列来源可以来自真实相机,因此我打算对相机也做一层抽象。最终呈现的效果将会是一幅点图,我打算采用pangolin进行绘图。
综上,我的配置过程和本文章的组织顺序是:
- ORB-SLAM2的封装
- 相机类的抽象
- 立体匹配算法的封装
- 三维重构系统的搭建
开始阐述我的过程之前,首先明确我们的平台和软件工具是:
- window 10
- 64位程序
- vs 2017
- C++
ORB-SLAM2的封装
我们首先来封装ORB-SLAM2。在这里,我得假设诸位已经成功在目标平台上,成功运行了ORB-SLAM2原始版本的程序。事实上,这篇博客是从[我的上一个系列博客]继承来的,因此我现在的状态是,已经为ORB-SLAM2配置好了各个依赖库,以及以ORB-SLAM2为启动项目,在vs下成功运行了。现在我要做的事情是,将ORB-SLAM2导出为dll,供后面三维重构系统使用。
在vs下配置过导出库的同学都知道,我们需要为被调用到的类加上API宣言,但ORB-SLAM2并不是一个库,它有很多烦人的头文件我们也不会用到,因此我更倾向于将它视为一种服务,我不会在ORB-SLAM2的源码上做修改,而是在ORB-SLAM2的vs工程添加以下两个文件装门用于封装导出:
// SLAM.h
#pragma once
#ifdef SLAM_EXPORTS
#define SLAM_API __declspec(dllexport)
#else
#define SLAM_API __declspec(dllimport)