本文介绍 Modern OpenCV 1 3D场景重建

Modern OpenCV 1: 3D场景重建

This article was original written by Jin Tian, welcome re-post, first come with https://jinfagang.github.io . but please keep this copyright info, thanks, any question could be asked via wechat: jintianiloveu

这个教程的原始连接在这里: 连接. 这是Modern OpenCV系列的第一篇,是时候静下心来学点东西了。今天用opencv来进行3D场景重建。首先我们要编译一下opencv,这个将依赖于contribute里面的sfm的一部分,但是sfm依赖于dnn,而dnn依赖于caffe,同时还依赖于一个叫做ceres-solver 的库。我们将要用到sfm里面的reconstruct方法,如果没有这个方法说明没有安装ceres-solver这个库了。首先安装ceres-solver:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# macOS
brew install ceres-solver
cd ~
wget http://ceres-solver.org/ceres-solver-1.13.0.tar.gz
tar -xvf ceres-solver-1.13.0.tar.gz
cd ceres-solver-1.13.0
mkdir build
cd build
make all -j8
sudo make install
# ubuntu
sudo apt-get install libgoogle-glog-dev
sudo apt-get install libatlas-base-dev
sudo apt-get install libeigen3-dev
# - If you want to build Ceres as a *static* library (the default)
sudo apt-get install libsuitesparse-dev
cd ~
wget http://ceres-solver.org/ceres-solver-1.13.0.tar.gz
tar -xvf ceres-solver-1.13.0.tar.gz
cd ceres-solver-1.13.0
mkdir build
cd build
make all -j8
sudo make install

然后要把opencv和contribute一起编译一下:

1
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D INSTALL_PYTHON_EXAMPLES=ON -D \ OPENCV_EXTRA_MODULES_PATH=~/opencv/opencv_contrib/modules -D PYTHON_EXECUTABLE=/usr/bin/python -D WITH_CUDA=OFF \ -D BUILD_SHARED_LIBS=OFF -D BUILD_EXAMPLES=ON ..

OK, 这么配置一下,这样就会把contribute一起安装,如果没有错的话应该也就没有什么问题了。

配置工作完成,接下来是代码时间,先show code再分析理论。请记住,这里貌似有个问题:如果说你没有在ceres-solver安装之前编译opencv,那么不管后面有没有安装ceres都不会import reconstruct的头文件,这个时候你确定你安装好了ceres,然后你直接打开opencv/opencv_contrib/modules/sfm ,这sfm.hpprecontruct.hpp里面的` #if CERES_FOUND这个注释掉. 或者说 在include这个地方加一个宏定义:

1
2
3
4
5
6
// this line must add before include sfm.hpp
#define CERES_FOUND true
#include "opencv2/sfm.hpp"
#include "opencv2/viz.hpp"
#include "opencv2/calib3d.hpp"
#include "opencv2/core.hpp"

这样应该就能导入reconstruct这个方法了。

3D重建sfm

opencv_contrib里面的modules的sfm里面有一些数据,也就是三张图片可以用来做一个演示。

_