在ubuntu18.04中安装opencv_contrib-3.2.0采坑教程


温馨提示

本篇文章已经收录在我最新出版的书籍《机器人SLAM导航核心技术与实战》,感兴趣的读者可以购买纸质书籍来进行更加深入和系统性的学习,购买链接如下:
  • 点这里购买:《机器人SLAM导航核心技术与实战》购买链接

由于最近要在OpenCV3中使用SIFT和SURF特征提取,而自从OpenCV2升级到OpenCV3版本后,SIFT、SURF等这些算法都被移出opencv默认项目库,而被放到叫opencv_contrib的项目库。因此需要手动下载opencv和opencv_contrib的源码,然后将两个源码放在一起手动编译安装。

由于我的电脑是VMware虚拟机跑的ubuntu18.04,并且ubuntu18.04中安装了ROS-melodic,而ROS-melodic装完后默认就把opencv-3.2.0版本顺带安装好了。所以,为了与ROS-melodic里面自带的opencv-3.2.0版本保持一致,我是下载了opencv-3.2.0和opencv_contrib-3.2.0源码,手动编译与安装,来覆盖ROS-melodic里面自带的opencv-3.2.0版本。下面我列出了我的环境:

  • VMware虚拟机
  • ubuntu18.04
  • opencv-3.2.0
  • opencv_contrib-3.2.0

1.下载opencv-3.2.0和opencv_contrib-3.2.0源码

去github下载就行了,下载地址如下:

  • opencv-3.2.0下载地址:  https://github.com/opencv/opencv/tree/3.2.0
  • opencv_contrib-3.2.0下载地址:  https://github.com/opencv/opencv_contrib/tree/3.2.0

下载好后将这两个文件同时解压到同个文件夹下,我是解压在opencv_install这样一个文件夹,如下图所示。

 2.安装相关依赖

在编译和安装opencv源码之前,需要先安装相关依赖库,安装命令如下:

sudo apt-get install build-essential 
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev

上面命令执行会报错,错误说libjaster-dev无法安装,解决办法如下:

sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
sudo apt update
sudo apt install libjasper1 libjasper-dev

3.用cmake-gui工具配置opencv编译参数

(1)安装cmake-gui工具

在正式编译opencv源码之前,需要对opencv中的CMake参数做设置,推荐用cmake-gui工具配置。先安装cmake-gui工具,如下命令:

sudo apt-get install cmake-gui

(2)设置cmake参数

打开终端,输入下面的命令,启动cmake-gui工具:

cmake-gui

在打开的界面中,将where is the source code栏中设成opencv-3.2.0的路径,将where to build the binaries栏中设成opencv-3.2.0/build的路径,如下图所示。

 然后点击Configure按钮,进行配置。配置过程会报错误,错误说缺vgg_generated_48.i之类的,解决办法是直接去网上下载vgg_generated_48.i这个文件,下载地址如下:

https://download.csdn.net/download/u013085286/10309843

下载好vgg_generated_48.i后,将这个文件复制到报错中提示的路径下就行了。以我的路径为例,用下面的命令复制:

cp vgg_generated_48.i /home/ubuntu1804/Downloads/opencv_install/opencv_contrib-3.2.0/modules/xfeatures2d/cmake/.download/e8d0dcd54d1bcfdc29203d011a797179/vgg_generated_48.i
上面命令中路径里面的e8d0dcd54d1bcfdc29203d011a797179根据你实际报错提示为准,类似的缺这些文件的错误,去网上下对应的文件,同样的方法解决就行了。
补齐了这些文件后, 然后再次点击Configure按钮,进行配置,应该就能正常配置了。

(3)设置cmake编译参数

在界面中将一下几个参数的取值设置好,具体参数和取值如下所示:
CMAKE_BUILD_TYPE参数取值Release,如下图所示。

 OPENCV_EXTRA_MODULES_PATH参数取值/home/ubuntu1804/Downloads/opencv_contrib-3.2.0/modules,这个路径的前面几个文件夹用你的实际路径替代,如下图所示。

 CMAKE_INSTALL_PREFIX参数取值/usr/local,如下图所示。

 这里需要特别提一下,还需要将ENABLE_PRECOMPILED_HEADERS参数取值设成OFF。如果不关闭这个参数的话,后面编译会报错误/usr/include/c++/7/cstdlib:75:15:fatal error:stdlib.h:No such file or direct.

 上面这些编译参数都设置好后,就可以点击Generate按钮,生成makefile文件。

4.编译和安装opencv

切换到opencv-3.2.0/build目录,用make和make install编译和安装就行了。

cd ~/Downloads/opencv_install/opencv-3.2.0/build/
make
sudo make install

当你执行完上面命令的时候,并看到100%的时候,恭喜你!安装成功!

参考文献

[1] 张虎,机器人SLAM导航核心技术与实战[M]. 机械工业出版社,2022.

前言 编程基础篇 第1章 ROS入门必备知识 1.1 ROS简介 2 1.1.1 ROS的性能特色 2 1.1.2 ROS的发行版本 3 1.1.3 ROS的学习方法 3 1.2 ROS开发环境的搭建 3 1.2.1 ROS的安装 4 1.2.2 ROS文件的组织方式 4 1.2.3 ROS网络通信配置 5 1.2.4 集成开发工具 5 1.3 ROS系统架构 5 1.3.1 从计算图视角理解ROS架构 6 1.3.2 从文件系统视角理解ROS架构 7 1.3.3 从开源社区视角理解ROS架构 8 1.4 ROS调试工具 8 1.4.1 命令行工具 9 1.4.2 可视化工具 9 1.5 ROS节点通信 10 1.5.1 话题通信方式 12 1.5.2 服务通信方式 15 1.5.3 动作通信方式 19 1.6 ROS的其他重要概念 25 1.7 ROS 2.0展望 28 1.8 本章小结 28 第2章 C++编程范式 2.1 C++工程的组织结构 29 2.1.1 C++工程的一般组织结构 29 2.1.2 C++工程在机器人中的组织结构 29 2.2 C++代码的编译方法 30 2.2.1 使用g++编译代码 31 2.2.2 使用make编译代码 32 2.2.3 使用CMake编译代码 32 2.3 C++编程风格指南 33 2.4 本章小结 34 第3章 OpenCV图像处理 3.1 认识图像数据 35 3.1.1 获取图像数据 35 3.1.2 访问图像数据 36 3.2 图像滤波 37 3.2.1 线性滤波 37 3.2.2 非线性滤波 38 3.2.3 形态学滤波 39 3.3 图像变换 40 3.3.1 射影变换 40 3.3.2 霍夫变换 42 3.3.3 边缘检测 42 3.3.4 直方图均衡 43 3.4 图像特征点提取 44 3.4.1 SIFT特征点 44 3.4.2 SURF特征点 50 3.4.3 ORB特征点 52 3.5 本章小结 54 硬件基础篇 第4章 机器人传感器 4.1 惯性测量单元 56 4.1.1 工作原理 56 4.1.2 原始数据采集 60 4.1.3 参数标定 65 4.1.4 数据滤波 73 4.1.5 姿态融合 75 4.2 激光雷达 91 4.2.1 工作原理 92 4.2.2 性能参数 94 4.2.3 数据处理 96 4.3 相机 100 4.3.1 单目相机 101 4.3.2 双目相机 107 4.3.3 RGB-D相机 109 4.4 带编码器的减速电机 111 4.4.1 电机 111 4.4.2 电机驱动电路 112 4.4.3 电机控制主板 113 4.4.4 轮式里程计 117 4.5 本章小结 118 第5章 机器人主机 5.1 X86与ARM主机对比 119 5.2 ARM主机树莓派3B+ 120 5.2.1 安装Ubuntu MATE 18.04 120 5.2.2 安装ROS melodic 122 5.2.3 装机软件与系统设置 122 5.3 ARM主机RK3399 127 5.4 ARM主机Jetson-tx2 128 5.5 分布式架构主机 129 5.5.1 ROS网络通信 130 5.5.2 机器人程序的远程开发 130 5.6 本章小结 131 第6章 机器人底盘 6.1 底盘运动学模型 132 6.1.1 两轮差速模型 132 6.1.2 四轮差速模型 136 6.1.3 阿克曼模型 140 6.1.4 全向模型 144 6.1.5 其他模型 148 6.2 底盘性能指标 148 6.2.1 载重能力 148 6.2.2 动力性能 148 6.2.3 控制精度 150 6.2.4 里程计精度 150 6.3 典型机器人底盘搭建 151 6.3.1 底盘运动学模型选择 152 6.3.2 传感器选择 152 6.3.3 主机选择 153 6.4 本章小结 155 SLAM篇 第7章 SLAM中的数学基础 7.1 SLAM发展简史 158 7.1.1 数据关联、收敛和一致性 160 7.1.2 SLAM的基本理论 161 7.2 SLAM中的概率理论 163 7.2.1 状态估计问题 164 7.2.2 概率运动模型 166 7.2.3 概率观测模型 171 7.2.4 概率图模型 173 7.3 估计理论 182 7.3.1 估计量的性质 182 7.3.2 估计量的构建 183 7.3.3 各估计量对比 190 7.4 基于贝叶斯网络的状态估计 193 7.4.1 贝叶斯估计 194 7.4.2 参数化实现 196 7.4.3 非参数化实现 202 7.5 基于因子图的状态估计 206 7.5.1 非线性最小二乘估计 206 7.5.2 直接求解方法 206 7.5.3 优化方法 208 7.5.4 各优化方法对比 218 7.5.5 常用优化工具 219 7.6 典型SLAM算法 221 7.7 本章小结 221 第8章 激光SLAM系统 8.1 Gmapping算法 223 8.1.1 原理分析 223 8.1.2 源码解读 228 8.1.3 安装与运行 233 8.2 Cartographer算法 240 8.2.1 原理分析 240 8.2.2 源码解读 247 8.2.3 安装与运行 258 8.3 LOAM算法 266 8.3.1 原理分析 266 8.3.2 源码解读 267 8.3.3 安装与运行 270 8.4 本章小结 270 第9章 视觉SLAM系统 9.1 ORB-SLAM2算法 274 9.1.1 原理分析 274 9.1.2 源码解读 310 9.1.3 安装与运行 319 9.1.4 拓展 327 9.2 LSD-SLAM算法 329 9.2.1 原理分析 329 9.2.2 源码解读 334 9.2.3 安装与运行 337 9.3 SVO算法 338 9.3.1 原理分析 338 9.3.2 源码解读 341 9.4 本章小结 341 第10章 其他SLAM系统 10.1 RTABMAP算法 344 10.1.1 原理分析 344 10.1.2 源码解读 351 10.1.3 安装与运行 357 10.2 VINS算法 362 10.2.1 原理分析 364 10.2.2 源码解读 373 10.2.3 安装与运行 376 10.3 机器学习与SLAM 379 10.3.1 机器学习 379 10.3.2 CNN-SLAM算法 411 10.3.3 DeepVO算法 413 10.4 本章小结 414 自主导航篇 第11章 自主导航中的数学基础 11.1 自主导航 418 11.2 环境感知 420 11.2.1 实时定位 420 11.2.2 环境建模 421 11.2.3 语义理解 422 11.3 路径规划 422 11.3.1 常见的路径规划算法 423 11.3.2 带约束的路径规划算法 430 11.3.3 覆盖的路径规划算法 434 11.4 运动控制 435 11.4.1 基于PID的运动控制 437 11.4.2 基于MPC的运动控制 438 11.4.3 基于强化学习的运动控制 441 11.5 强化学习与自主导航 442 11.5.1 强化学习 443 11.5.2 基于强化学习的自主导航 465 11.6 本章小结 467 第12章 典型自主导航系统 12.1 ros-navigation导航系统 470 12.1.1 原理分析 470 12.1.2 源码解读 475 12.1.3 安装与运行 479 12.1.4 路径规划改进 492 12.1.5 环境探索 496 12.2 riskrrt导航系统 498 12.3 autoware导航系统 499 12.4 导航系统面临的一些挑战 500 12.5 本章小结 500 第13章 机器人SLAM导航综合实战 13.1 运行机器人上的传感器 502 13.1.1 运行底盘的ROS驱动 503 13.1.2 运行激光雷达的ROS驱动 503 13.1.3 运行IMU的ROS驱动 504 13.1.4 运行相机的ROS驱动 504 13.1.5 运行底盘的urdf模型 505 13.1.6 传感器一键启动 506 13.2 运行SLAM建图功能 506 13.2.1 运行激光SLAM建图功能 507 13.2.2 运行视觉SLAM建图功能 508 13.2.3 运行激光与视觉联合建图功能 508 13.3 运行自主导航 509 13.4 基于自主导航的应用 510 13.5 本章小结 511 附录A Linux与SLAM性能优化的探讨 附录B 习题